AWD在dalao的幫忙下打了幾場,隊伍中兩個web手核偿,一個pwn手,當(dāng)然web是一攻一防顽染,pwn手就比較辛苦漾岳。我主要負(fù)責(zé)一些運(yùn)維的事務(wù),這里針對awd運(yùn)維做一點(diǎn)小總結(jié)粉寞。
備份尼荆,很關(guān)鍵
window平臺推薦winscp傻瓜操作。
Linux平臺推薦將web目錄打包唧垦,再下載
tar zcf backup.zip /var/www/html
隱藏用戶
遇到過兩次隱藏用戶的坑了捅儒。
查看home目錄下是否有其他用戶
/etc/passwd是否有/bin/bash的用戶
看到用戶先su一下,看看是否可以直接切換(主辦方有時候會預(yù)留)振亮。
如果不可以在用弱口令爆破密碼巧还,有一次HD學(xué)長就根據(jù)這個通殺全場,具體腳本可以參考這里
提權(quán)
個人并不是很推薦坊秸,很多時候會費(fèi)力不討好狞悲,很多時候主辦方給與的權(quán)限實在過小,不過小比賽提權(quán)還是相對容易妇斤。
這里推薦幾款工具
LinEnum
Linux_Exploit_Suggester
linuxprivchecker.py
同時摇锋,github上也有人總結(jié)了歷年影響較大的提權(quán)exp
linux-kernel-exploits
如果可以提權(quán)的話,刪除系統(tǒng)中不必要的用戶
刪除后門
這里主要參考這里
find . -name '*.php' | xargs grep -n 'eval('
find . -name '*.php' | xargs grep -n 'assert('
find . -name '*.php' | xargs grep -n 'system('
find . -name '*.php' | xargs grep -n 'shell_exec'
find . -name '*.php' | xargs grep -n 'exec'
find . -name '*.php' | xargs grep -n 'proc_open'
find . -name '*.php' | xargs grep -n -E 'preg_replace*e'1
同時這里配合D盾查殺站超,就刪除后門荸恕。
不過有時候主辦方的后門會十分隱蔽,這個時候就需要借助什么都報的seay源碼審計工具來配合查找后門死相,找到后門第一時間交給負(fù)責(zé)攻擊的人融求。
流量監(jiān)控
在條件比較寬松的情況下
這里采用wupco師傅的腳本,十分方便
git clone https://github.com/wupco/weblogger
一套集成算撮,然后直接用里面的一套就好
然后批量包含就好
find /var/www/html/ -path /var/www/html/124687a7bc37d57cc9ecd1cbd9d676f7 -prune -o -type f -name '*.php'|xargs sed -i '1i<?php require_once("/tmp/33253f64133730fabaa52a487ff98740/weblogpro.php");?>'
在條件比較苛刻的情況下
這里就采用virink師傅的腳本生宛,github之前的刪掉了县昂,參考這里
<?php
error_reporting(0);
define('LOG_FILEDIR','./logs');
function waf()
{
if (!function_exists('getallheaders')) {
function getallheaders() {
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_')
$headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
}
return $headers;
}
}
$get = $_GET;
$post = $_POST;
$cookie = $_COOKIE;
$header = getallheaders();
$files = $_FILES;
$ip = $_SERVER["REMOTE_ADDR"];
$method = $_SERVER['REQUEST_METHOD'];
$filepath = $_SERVER["SCRIPT_NAME"];
foreach ($_FILES as $key => $value) {
$files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']);
file_put_contents($_FILES[$key]['tmp_name'], "virink");
}
unset($header['Accept']);
$input = array("Get"=>$get, "Post"=>$post, "Cookie"=>$cookie, "File"=>$files, "Header"=>$header);
logging($input);
}
function logging($var){
$filename = $_SERVER['REMOTE_ADDR'];
$LOG_FILENAME = LOG_FILEDIR."/".$filename;
$time = date("Y-m-d G:i:s");
file_put_contents($LOG_FILENAME, "\r\n".$time."\r\n".print_r($var, true), FILE_APPEND);
file_put_contents($LOG_FILENAME,"\r\n".'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'], FILE_APPEND);
file_put_contents($LOG_FILENAME,"\r\n***************************************************************",FILE_APPEND);
}
waf();
?>
然后
require_once('waf.php');
就會在當(dāng)前目錄生成logs,里面就是數(shù)據(jù)包
上傳文件解析問題
.htaccess
<Directory "/var/www/html/uploads">
Options -ExecCGI -Indexes
AllowOverride None
RemoveHandler .php .phtml .php3 .pht .php4 .php5 .php7 .shtml
RemoveType .php .phtml .php3 .pht .php4 .php5 .php7 .shtml
php_flag engine off
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">
deny from all
</FilesMatch>
</Directory>
文件監(jiān)控
文件監(jiān)控一種比較方便的方法就是提前準(zhǔn)備好pyinotify庫
sudo pythonXXX setup.py install
也可以直接將自己的目錄復(fù)制下來陷舅,到時候直接傳到服務(wù)器的目錄上就好
/usr/local/lib/python2.7/dist-packages
在配置文件可控的情況下
參考這里
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ** Author: ssooking
import os
import argparse
from pyinotify import WatchManager, Notifier,ProcessEvent
from pyinotify import IN_DELETE, IN_CREATE,IN_MOVED_TO,IN_ATTRIB
class EventHandler(ProcessEvent):
"""事件處理"""
#創(chuàng)建
def process_IN_CREATE(self, event):
print "[!] Create : " + event.pathname
DeleteFileOrDir(event.pathname)
#刪除
def process_IN_DELETE(self, event):
print "[!] Delete : " + event.pathname
#文件屬性被修改倒彰,如chmod、chown命令
def process_IN_ATTRIB(self, event):
print "[!] Attribute been modified:" + event.pathname
#文件被移來莱睁,如mv待讳、cp命令
def process_IN_MOVED_TO(self, event):
print "[!] File or dir been moved to here: " + event.pathname
DeleteFileOrDir(event.pathname)
def DeleteFileOrDir(target):
if os.path.isdir(target):
fileslist = os.listdir(target)
for files in fileslist:
DeleteFileOrDir(target + "/" + files)
try:
os.rmdir(target)
print " >>> Delete directory successfully: " + target
except:
print " [-] Delete directory failed: " + target
if os.path.isfile(target):
try:
os.remove(target)
print " >>> Delete file successfully" + target
except:
print " [-] Delete file filed: " + target
def Monitor(path):
wm = WatchManager()
mask = IN_DELETE | IN_CREATE | IN_MOVED_TO | IN_ATTRIB
notifier = Notifier(wm, EventHandler())
wm.add_watch(path, mask,rec=True)
print '[+] Now Starting Monitor: %s'%(path)
while True:
try:
notifier.process_events()
if notifier.check_events():
notifier.read_events()
except KeyboardInterrupt:
notifier.stop()
break
if __name__ == "__main__":
parser = argparse.ArgumentParser(
usage="%(prog)s -w [path]",
description=('''
Introduce:Simple Directory Monitor! by ssooking''')
)
parser.add_argument('-w','--watch',action="store",dest="path",default="/var/www/html/",help="directory to watch,default is /var/www/html")
args=parser.parse_args()
Monitor(args.path)
在python配置目錄不可控的情況下
參考這里尋找的腳本,放置到可以寫讀的目錄仰剿,自動刪除創(chuàng)建的php文件
#!/usr/bin/python
#coding=utf-8
#Usage :python demo.py
#Code by : AdminTony
#QQ : 78941695
#注意:要將此文件放在有讀寫權(quán)限的目錄以及所有修改過的php必須在此目錄或者該目錄的子目錄中创淡。
#作用:讀取被修改過的文件,然后將文件的地址加上內(nèi)容全部存放在txt
import sys,subprocess,os
#查找最近10分鐘被修改的文件
def scanfile():
#command: find -name '*.php' -mmin -10
command = "find -name \'*.php\' -mmin -10"
su = subprocess.Popen(command,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
STDOUT,STDERR = su.communicate()
list = STDOUT.split("\n")
#print str(list)
#將文件處理成list類型然后返回南吮。
return list
#讀取文件:
def loadfile(addr):
data = ""
#如果文件不存在就跳出函數(shù)
try :
file = open(addr,'r')
data = file.read()
except :
return 0
all_data = addr+"\n"+data+"\n\n"
file1 = open("shell.txt",'a+')
#避免重復(fù)寫入
try:
shell_content = file1.read()
except:
shell_content = "null"
#如果文件內(nèi)容不為空再寫入琳彩,避免寫入空的。
#print shell_content
if data :
if all_data not in shell_content:
file1.write(all_data)
file.close()
file1.close()
rm_cmd = "rm -rf "+addr
su = subprocess.Popen(rm_cmd,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
su.communicate()
print "loadfile over : "+addr
if __name__ == '__main__':
while True:
list = scanfile()
if list :
for i in range(len(list)):
#如果list[i]為空就不讀取了
if list[i]:
loadfile(str(list[i]))
else : pass
這樣部凑,前期的工作已經(jīng)完成汁针。
假flag
這里參考一航師傅
curl
alias curl='python -c "__import__(\"sys\").stdout.write(\"flag{%s}\\n\" % (__import__(\"hashlib\").md5(\"\".join([__import__(\"random\").choice(__import__(\"string\").letters) for i in range(0x10)])).hexdigest()))"'
cat
alias cat='python -c "__import__(\"sys\").stdout.write(\"flag{%s}\\n\" % (__import__(\"hashlib\").md5(\"\".join([__import__(\"random\").choice(__import__(\"string\").letters) for i in range(0x10)])).hexdigest()))"'
代碼審計
前期已經(jīng)將一些基礎(chǔ)的內(nèi)容都做了,這里就開始代碼審計
首先推薦用seay源碼審計工具掃描查看sql注入砚尽,文件上傳等情況
sql注入
addslashes()
mysql_real_escape_string()
其實awd中主要還是根據(jù)官方后門來打施无,源碼審計出新漏洞一般都是抄作業(yè),新手還是很難挖掘出漏洞的
殺不死馬
1.重啟服務(wù)(一般沒權(quán)限)
2.
<?php
while (1) {
$pid=1234;
@unlink('.demo.php');
exec('kill -9 $pid');
}
?>
參考:
https://github.com/admintony/Prepare-for-AWD
https://blog.csdn.net/qq_42572322/article/details/81700635