m0nst3r's blog

Hello, Bugs

0%

准备nginx环境

建立目录专门用作ssl的证书申请

1
2
mkdir -p /www/sites/le_root/.well-known/acme-challenge
chown -R root:www-data /www/sites/le_root

新建一个nginx配置文档/www/nginx/acme-challenge.conf,用作申请证书时的认证

1
2
3
location /.well-known/acme-challenge/ {
alias /www/sites/le_root/.well-known/acme-challenge/;
}

想让哪个网站配置ssl之前,先编辑对应的配置文件,相当于apache的vhost

1
2
3
4
5
6
7
server {
listen 80;
server_name mydomain.com;
# ....
# Let's Encrypt webroot
include /www/nginx/acme-challenge.conf;
}

重启nginx
systemctl reload nginx.service

证书申请与安装

acme.sh的安装很简单,不重复了。

Read more »

使用从网上下载的tcpdump, 遇到以下错误:

error: only position independent executables (PIE) are supported.

直接使用NDK在电脑上交叉编译一个。

GitHub上有个脚本,[https://github.com/imrivera/build-android-tcpdump.git]

直接编译会产生错误因为libpcap版本的原因,好在上面的脚本提供了选择版本的参数。

1
2
git clone https://github.com/imrivera/build-android-tcpdump.git
./build-android-tcpdump -a arm64 -n /Users/michael/Library/Android/android-ndk-r10e -l 1.4.0

抓包:
./tcpdump -vv -p -s 0 -w /sdcard/Mcart003.pcap

Read more »

访问我的服务器,配置好HTTPS,却怎么也访问不了。
让朋友测试,那边网络没问题,于是我挂上SS的VPN,结果还是不能访问。
挂上ExpressVPN,访问成功。

断开VPN,测试网络,却发现了一件细思极恐的事情:

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
$ sudo traceroute www.baidu.com
Password:
traceroute to www.a.shifen.com (119.75.217.109), 64 hops max
1 192.168.1.1 0.891ms 0.748ms 0.711ms
2 117.100.128.1 2.796ms 4.092ms 2.412ms
3 124.205.97.48 4.353ms 4.192ms 3.938ms
4 124.205.98.185 4.487ms 4.192ms 4.391ms
5 14.197.243.61 3.509ms 4.679ms 4.105ms
6 14.197.149.178 4.838ms 4.168ms 3.958ms
7 182.61.253.119 5.056ms 5.903ms 3.998ms
8 182.61.253.126 4.463ms 4.007ms 4.264ms
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 * * *

# michael @ m0nst3r in ~ [22:20:30] C:1
$

喵了个咪的!

Read more »

至于为什么要做这个,你们都懂的。

SSHD那边的设置:

1
2
3
4
5
# /etc/ssh/sshd_config
GatewayPorts yes
AllowTcpForwarding yes
PermitRootLogin yes
PasswordAuthentication yes

一个ssh_tunnel有脚本:

1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash

if [ -n "$1" ]
then
echo 0.0.0.0:$1"--<>--"ssh_server:$1
ssh -C -g -i xxx.pem root@VPS -R $1:127.0.0.1:$1
else
echo 0.0.0.0:53"--<>--"ssh_server:53
ssh -C -g -i xxx.pem root@VPS -R 53:127.0.0.1:53
fi

Read more »

[TOC]

漏洞原理

Bash使用的环境变量是通过函数名称来调用的,导致漏洞出问题的是以(){开头定义的环境变量在命令EVN中解析成函数后,Bash执行并未推出,而是继续解析并执行shell命令。而其核心的原因在于输入的过滤中没有严格限制边界,也没有作出合法化的参数判断。

在补丁中主要进行了参数的合法性过滤,补丁程序在/builtins/evalstring.cparse_and_execute函数中对输入的合法性边界检测,将代码注入的可能性排除。在排除中,主要用到了flag的两次判断和command的一次类型匹配,为了能够flag判断准确,在补丁中预先定义了SEVAL_FUNCDEFSEVAL_ONECMD两个标识作为判断依据。此漏洞的补丁更新有三处,主要进行输入的command进行过滤作用。

1
2
3
4
/* /builtins/common.h */

#define SEVAL_FUNCDEF 0x080 /* only allow function definitions */
#define SEVAL_ONECMD 0x100 /* only allow a single command */
1
2
3
4
5
6
7
8
9
/* /builtins/evalstring.c */

if((flags & SEVAL_FUNCDEF) && command->type != cmd_function_def )
{
internal_warning("%s: ignoring function definition attempt", from_file);
should_jump_to_top_level = 0;
last_result = last_command_exit_value = EX_BADUSAGE;
break
}
1
2
3
4
/* /builtins/evalstring.c */

if (flags & SEVAL_ONECMD)
break;

从以上阐述的漏洞原理可知,漏洞的根本原因存在于Bash的ENV命令实现上,因此漏洞本身是不能够直接导致远程代码执行的。如果要达到远程代码执行的目的,必须借助第三方服务程序作为媒介才能够实现,第三方服务程序也必须要满足众多条件才可以充当此媒介的角色。例如,apache2便可以,其CGI组件满足远程访问并调用Bash的ENV命令进行访问数据解析功能。漏洞实现远程代码执行原理图如下:
14139550048538.png

实验环境

VulApps/b/bash/shellshock1_CVE-2014-6271

Read more »

如下图所示,先清空本地DNS解析缓存(windows和linux的清空方法请自行搜索),然后用dig命令查看可知:

本地未发现缓存,直接查询根,根返回`com.`域, 在查询`com.`,返回`baidu.com.`,在查询`baidu.com.`,返回`www.baidu.com` 主机的A记录,即IP地址。
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
# michael @ m0nst3r in ~ [20:45:48] 
$ dscacheutil -flushcache

# michael @ m0nst3r in ~ [20:46:19]
$ dig +trace www.baidu.com

; <<>> DiG 9.10.6 <<>> +trace www.baidu.com
;; global options: +cmd
. 14138 IN NS g.root-servers.net.
. 14138 IN NS f.root-servers.net.
. 14138 IN NS a.root-servers.net.
. 14138 IN NS e.root-servers.net.
. 14138 IN NS h.root-servers.net.
. 14138 IN NS d.root-servers.net.
. 14138 IN NS k.root-servers.net.
. 14138 IN NS i.root-servers.net.
. 14138 IN NS l.root-servers.net.
. 14138 IN NS c.root-servers.net.
. 14138 IN NS b.root-servers.net.
. 14138 IN NS m.root-servers.net.
. 14138 IN NS j.root-servers.net.
;; Received 695 bytes from 192.168.1.1#53(192.168.1.1) in 5 ms

com. 172800 IN NS a.gtld-servers.net.
com. 172800 IN NS b.gtld-servers.net.
com. 172800 IN NS c.gtld-servers.net.
com. 172800 IN NS d.gtld-servers.net.
com. 172800 IN NS e.gtld-servers.net.
com. 172800 IN NS f.gtld-servers.net.
com. 172800 IN NS g.gtld-servers.net.
com. 172800 IN NS h.gtld-servers.net.
com. 172800 IN NS i.gtld-servers.net.
com. 172800 IN NS j.gtld-servers.net.
com. 172800 IN NS k.gtld-servers.net.
com. 172800 IN NS l.gtld-servers.net.
com. 172800 IN NS m.gtld-servers.net.
com. 86400 IN DS 30909 8 2 E2D3C916F6DEEAC73294E8268FB5885044A833FC5459588F4A9184CF C41A5766
com. 86400 IN RRSIG DS 8 1 86400 20181028050000 20181015040000 2134 . HHrLrltU/Pzku1DAAlxYsgUID+DnKajqKudOxnLwQNFKh2SkkA6le5cF ++eRShsNX7Q+lq2+5E5BMLF8+cm6zGC1VKoQLzIihdts7osyYviPvJ6/ lcCjV2OnF+EvEQhOCnBDhGkF5nmq+LIoEODyu2F51kneQqgWIjHvPvPG GGzMyTXpJC8pKo+VVDxcZf1nBjk6qHnM+dHB8aF0RS9hDupFHD55ePXD 6JIL87fmZW4be/Pe0haPtTVkzDRnY5RK5oQm7d1ryQV6NJB0sQJjSG7m nNLXofugjh5B6wWb8ZX24QYcDxSZvy52BF+DuGzkClRZQfCGDcToZx4y Lj5CGg==
;; Received 1173 bytes from 199.7.91.13#53(d.root-servers.net) in 232 ms

baidu.com. 172800 IN NS dns.baidu.com.
baidu.com. 172800 IN NS ns2.baidu.com.
baidu.com. 172800 IN NS ns3.baidu.com.
baidu.com. 172800 IN NS ns4.baidu.com.
baidu.com. 172800 IN NS ns7.baidu.com.
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN NSEC3 1 1 0 - CK0Q1GIN43N1ARRC9OSM6QPQR81H5M9A NS SOA RRSIG DNSKEY NSEC3PARAM
CK0POJMG874LJREF7EFN8430QVIT8BSM.com. 86400 IN RRSIG NSEC3 8 2 86400 20181020121530 20181013110530 46475 com. dwbSHWsE9XgYaIlfAvddRHnM+SyareZ63CYwXOcbO3tcu7wpslbjNn37 tbqnZa89rsIKO1mzWUdxM5fQtXXj2k+haz8SV42mtiU9WvkXBx0jnUjn 18UXq+X1u/uLfwPOIIy0tDcFW8OdQB3nE18aCVIzy9YUcrFMilNQ+vP6 OSM=
HPVV2B5N85O7HJJRB7690IB5UVF9O9UA.com. 86400 IN NSEC3 1 1 0 - HPVVP23QUO0FP9R0A04URSICJPESKO9J NS DS RRSIG
HPVV2B5N85O7HJJRB7690IB5UVF9O9UA.com. 86400 IN RRSIG NSEC3 8 2 86400 20181021051422 20181014040422 46475 com. OIF0G5EhzboJ66h6mM+eslGRta4aM5M77zOMwZklsSgSBCpNdHByfteP WDx6PdN6a+QyoZQfjGjc2b8mnUxT+6rypSeHShrQdnPoFa/GtrOeWZS7 LVktINNV9hP/X2qk664VY05Q8SXSK1btMv68QXIznnx6DTZV6R4X2Dk4 mwk=
;; Received 697 bytes from 192.42.93.30#53(g.gtld-servers.net) in 277 ms

www.baidu.com. 1200 IN CNAME www.a.shifen.com.
a.shifen.com. 1200 IN NS ns1.a.shifen.com.
a.shifen.com. 1200 IN NS ns4.a.shifen.com.
a.shifen.com. 1200 IN NS ns5.a.shifen.com.
a.shifen.com. 1200 IN NS ns3.a.shifen.com.
a.shifen.com. 1200 IN NS ns2.a.shifen.com.
;; Received 239 bytes from 61.135.165.235#53(ns2.baidu.com) in 29 ms

完整的流程如下:

1
2
3
4
5
6
7
8
9
10
1. 本机向local dns请求www.baidu.com
2. local dns向根域请求www.baidu.com,根域返回com.域的服务器IP
3. 向com.域请求www.baidu.com,com.域返回baidu.com域的服务器IP
4. 向baidu.com请求www.baidu.com,返回cname www.a.shifen.com和a.shifen.com域的服务器IP
5. 向root域请求www.a.shifen.com
6. 向com.域请求www.a.shife.com
7. 向shifen.com请求
8. 向a.shifen.com域请求
9. 拿到www.a.shifen.com的IP
10. localdns返回本机www.baidu.com cname www.a.shifen.com 以及 www.a.shifen.com的IP

另外一篇文章说的比较明白,向前辈致敬:
https://www.cnblogs.com/liyuanhong/articles/7353974.html

Read more »

使用sqlmap会使测试数据库中插入大量测试语句,而且产生大量日志,下面的方法利用mysql在scalar subquiryinsert into类型的注入转换为Time-based blind注入。

先看执行效果:

1
2
3
4
5
mysql> select (select case when 1=1 then sleep(1) else 'hello' end from ((select 1 as a) union (select 2 as a)) test);
ERROR 1242 (21000): Subquery returns more than 1 row
mysql> select (select case when 1=2 then sleep(1) else 'hello' end from ((select 1 as a) union (select 2 as a)) test);
ERROR 1242 (21000): Subquery returns more than 1 row

先看语句:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
select (
select case
when 1=1
then sleep(3)
else
'hello'
end
from
(
(select 1 as a)
union
(select 2 as a)
)
test);

经过实验可得,如果from后面,union前后的两个select子查询使用相同的值,则会返回一列,故不会出错,从而导致insert into语句成功执行;当两个值不相同时,无论判断成功与否,都会导致insert into语句执行失败,从而转化为时间盲注。

参考:
http://www.mathyvanhoef.com/2011/10/exploiting-insert-into-sql-injections.html
https://dev.mysql.com/doc/refman/5.6/en/scalar-subqueries.html

Read more »

分类

  • 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:// — 处理交互式的流

php://

直接访问PHP进程的输入或者输出流:

  • php://stdin:只读
  • php://stdout:只写
  • php://stderr:只写

php://input

php://input是可以访问请求的原始数据的只读流。

POST请求的情况下,最好使用php://input来替代$_HTTP_RAW_POST_DATA,因为它不依赖于特定的php.ini指令。

enctype="multipart/form-data"的时候php://input是无效的。

php://output

Read more »

[TOC]

非交互式添加用户并创建密码

1
2
3
4
5
6
7
$ useradd test
$ echo "test:123" | sudo chpasswd

$ useradd test2
$ echo "123" | passwd --stdin test2

$ passwd -d test2 #(设置密码之后)删除密码,即可以空密码登录

获取Windows机器上保存的WIFI密码

Powershell

(netsh wlan show profiles) | Select-String "\:(.+)$" | %{$name=$_.Matches.Groups[1].Value.Trim(); $_} | %{(netsh wlan show profile name="$name" key=clear)} | Select-String "Key Content\W+\:(.+)$" | %{$pass=$_.Matches.Groups[1].Value.Trim(); $_} | %{[PSCustomObject]@{ PROFILE_NAME=$name;PASSWORD=$pass }} | Format-Table -AutoSize

命令行

netsh wlan show profiles "NETWORK-SSID" key=clear

Read more »

日常用到的powershell命令及脚本

更改文件夹的“修改时间”

1
2
3
$a = Get-Date "02/09/2013 4:59 PM"
$d = [system.io.directoryinfo]"C:\Users\user\Documents\CV"
$d.LastWriteTime = $a

更改文件夹下所有文件“修改时间”

1
2
3
4
5
6
7
$a = Get-Date "2/13/2007 8:00 AM"
$b = Get-ChildItem "C:\Scripts"
foreach ($i in $b)
{
$i.LastWriteTime = $a
$a = $a.AddMinutes(1)
}
Read more »