OpenVpn 安全部署实战指南 [一]
0x01 关于openvpn1
2一种基于OpenSSL加密库的开源VPN实现,此处的主要目的还是旨在说明如何快速安全部署openvpn
关于其内部的加解密细节及封装与解封装过程,相信大家都已经比较熟练了,此处不做过多涉及,暂以实战上手应用为主
0x02 openvpn 可工作于两种不同的模式,使用 TUN / TAP 作为接口建立隧道,但需要相应内核支持1
2
3TUN 接口创建的是三层路由隧道,实际中用的较多,TAP 是二层网卡桥接隧道,即创建一个以太网桥接,相对复杂
TAP 接口的好处在于,客户端可以获得 VPN 服务器所处子网的 IP [即,忽略物理上的区别,可以完全将客户端看做是与VPN服务器处于同一子网的另一台机器]
而TUN 接口下所有的客户端则处于一个完全独立的子网内,与 VPN 服务器所在的子网没有关系,待到后面实际部署时,会深有体会的
0x03 下面则是 openvpn 提供的两种安全模式1
2Static Key
X509 PKI [Public Key Infrastructure]
此次演示环境1
2
3
4OpenVpnServer ip: 192.168.3.71 [假设为公网ip] ip: 192.168.6.39 [假设为其所在的内网ip] ip: 192.168.7.39 [假设为其所在的另一个内网ip]
OpenVpnClient ip: 192.168.6.41 [内网ip] ip: 192.168.7.41 [另一个内网ip段] 为OpenVpnServer所在内网段的一台linux机器
win7cn ip: 192.168.32.253 [本地机器的内网ip] 作为连接OpenVpnServer的windows访问客户端
CentOS6.8_x86_64 ip: 192.168.32.136 [本地机器的内网ip] 作为连接OpenVpnServer的linux访问客户端
我们要实现的最终目的1
2通过拨入 OpenVpnServer 可在本地直接访问远程内网,即`192.168.32.x`和`192.168.6.x`,本身是两个完全独立相互不同的内网段
但现在要实现的效果就是,可以直接在win7cn或者CentOS6.8上ping通OpenVpnServer所在内网中的OpenVpnClient机器
0x04 Ok,明确了最终目的之后,我们就开始来实战部署OpenVpn
首先,进行一些前期的必要环境准备,务必严格保证所有机器时间完全一致,此项非常重要,否则后期OpenVpn客户端在连服务端时会出现证书无法被验证的情况1
2
3
4# /usr/sbin/ntpdate time.nist.gov 先手工在所有机器上同步一次,之后再加到计划任务中自动同步即可
# crontab -e
*/2 * * * * /usr/sbin/ntpdate time.nist.gov > /dev/null 2>&1
# crontab -l
安装C编译器及openssl加密库,众所周知,openvpn依赖openssl对隧道数据进行加密1
# yum install -y gcc gcc-c++ openssl openssl-devel
禁用selinux,之后一定要记得重启下系统,才可生效1
2
3# setenforce 0
# sed -i '/^SELINUX=/c\SELINUX=disabled' /etc/selinux/config
# shutdown -r now
准备好环境所需的源码包,此,分别为数据压缩库和openvpn自身的源码包openvpn的下载地址可能已经被墙掉了,大家暂时挂ss下一下就好了
1
2# wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.06.tar.gz
# wget https://build.openvpn.net/downloads/releases/openvpn-2.2.2.tar.gz
编译安装LZO,主要用它来压缩通信数据加快传输速度1
2
3
4# tar xf lzo-2.06.tar.gz
# cd lzo-2.06
# ./configure && make && make install
# echo $?
0x05 编译安装OpenVPN,记得要载入lzo一起编译1
2
3
4
5
6# tar -zxf openvpn-2.2.2.tar.gz
# cd openvpn-2.2.2
# ./configure --with-lzo-headers=/usr/local/lzo/include --with-lzo-lib=/usr/local/lzo/lib
# make && make install
# echo $?
# which openvpn 如果能看到路径,说明openvpn已经基本安装成功,默认是在/usr/local/sbin/openvpn目录下
0x06 安装成功后,我们就开始来实际部署配置OpenVpn
首先,修改默认证书信息,而后,以此来创建各种证书1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19# cd /root/openvpn-2.2.2/easy-rsa/2.0/ && ll
# cp vars vars.bak
# vi vars
export KEY_COUNTRY="CN"
export KEY_PROVINCE="BJ"
export KEY_CITY="BeiJing"
export KEY_ORG="klionsec"
export KEY_EMAIL="klion@rootkit.org"
export KEY_EMAIL=klion@rootkit.org
export KEY_CN=CN
export KEY_NAME=kliosec
export KEY_OU=klionsec
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234
# tail -n 11 vars
# source vars 重新载入,让变量生效
# ./clean-all 把之前已有的证书全部先删掉
# ./build-ca 创建ca证书ca.crt 及根密钥ca.key [基本上一路按回车就好],因为在vars文件中已经定义好了默认的变量值,生成时会自动逐个读取
# ll keys/ 看下刚刚生成的ca证书在keys目录里有没有
创建服务端证书及密钥 [ 中间会有一处让你输入密码,注意,后续创建证书时的密码最好都跟此密码保持一致,防止认证失败,之后再按照提示输入两次y即可]
1
2# ./build-key-server server
# ll keys/
创建完服务端证书和秘钥后,我们还需要为每一个登陆到OpenVpn服务器的客户端创建一个证书,注意直接用build-key
创建的客户端证书默认是没密码的,也就是说,别人只要拿到你的这套客户端的证书就可以直接连上vpn服务器,有一定风险,当然,前提也得服务端配置中允许同一用户多点登陆才行,后续如果还要新增客户端用户,只需要再用build-key生成即可1
2# ./build-key client 注意,这里也会提示输入密码,为了避免出问题,和上面创建服务端证书时设置的密码保持一致即可
# ll keys/
1 | # ./build-key-pass clientsec 如果你想创建带密码的客户端证书,直接用 build-key-pass 来创建即可 |
创建秘钥交换协议文件1
2
3# ./build-dh 即迪菲·赫尔曼密钥,会生成dh1024.pem文件,生成过程可能会比较慢,在此期间不要去中断它
# ll keys/
# openvpn --genkey --secret keys/ta.key 生成ta.key文件,防DDos攻击,UDP淹没等恶意攻击,说实话,效果貌似并不太好
0x07 创建并修改openvpn服务器配置文件,将需要用到的openvpn证书和密钥复制一份到创建好的keys目录中1
2
3
4
5
6
7
8
9
10# mkdir -pv /etc/openvpn
# cd /root/openvpn-2.2.2/easy-rsa/2.0
# cp -ap keys/ /etc/openvpn/
# cd ../../
# cp sample-config-files/{server.conf,client.conf} /etc/openvpn/
# tree /etc/openvpn/
# cd /etc/openvpn/
# cp -a server.conf server.conf.bak
# grep '^[^#;]' /etc/openvpn/server.conf > tmp.txt
# cat tmp.txt > server.conf
1 | # 下面是openvpn服务端的完整配置 |
0x08 修改完OpenVpn服务端配置后,我们再来稍微调整一些系统配置,如下
开启系统路由转发,因为在拨入成功后还要访问vpn服务器所在内网中的其它机器,所以转发是必须的1
2# sed -i '/net.ipv4.ip_forward/s/0/1/' /etc/sysctl.conf
# sysctl -p
如果开了iptables,记得把tcp的11941端口[实际中是你自己设置的openvpn服务端口]
和转发都放开,不然客户端可能会连不上,如果压根没开,可暂时不用管1
2
3
4
5# vi /etc/sysconfig/iptables
-A INPUT -p tcp --dport 11941 -j ACCEPT
# iptables -A INPUT -p tcp --dport 11941 -j ACCEPT
# iptables -L -n
# /etc/init.d/iptables status
最后,我们来尝试启动OpenVpn服务1
2
3
4
5
6# /usr/local/sbin/openvpn --config /etc/openvpn/server.conf &
# netstat -tulnp | grep openvpn
# echo "/usr/local/sbin/openvpn --config /etc/openvpn/server.conf &" >> /etc/rc.local
# tail -n 1 /etc/rc.local
# ifconfig -a openvpn服务一旦成功启动系统中就会多出一个名为tun0的虚拟网卡
# pkill openvpn
当然,除了手工去加载服务端配置文件来启动,你也可以用openvpn自己提供好的服务启动脚本来配置成常规启动,只是自己不太喜欢这样搞,过程非常简单,如下1
2
3
4
5
6
7
8# cp /root/openvpn-2.2.2/sample-scripts/openvpn.init /etc/init.d/openvpn
# chmod 700 /etc/init.d/openvpn
# chkconfig openvpn on
# chkconfig --list
# /etc/init.d/openvpn restart 会有报错
# vi /etc/init.d/openvpn 把148行的*.conf改成server.conf,这个目录下不能有多个.conf否则就会被干扰到
# /etc/init.d/openvpn restart 正常启动
# lsof -i :1194
0x09 把服务端完全搞定以后,我们再来看如何在不同系统平台下配置OpenVpn客户端进行连接
先下载并安装好 OpenVpn 的windows版客户端工具,地址已被墙1
http://swupdate.openvpn.org/community/releases/openvpn-2.2.2-install.exe
此时,再到OpenVpn服务端去把指定客户端的证书及配置文件都下载下来[此处以client用户为例]
,之后再把这些文件全部复制到你OpenVpn客户端的config目录中,此处的OpenVpn客户端config目录是在如下的路径上,而你则要根据你自己的OpenVpn客户端安装目录来调整1
2# cd /etc/openvpn/keys/
# sz ca.crt client.crt client.key
1 | ca.crt client.crt client.key 所有要复制的文件 |
1 | # 手工创建好客户端配置文件,文件具体内容如下,注意在windows中客户端配置文件名必须为 client.ovpn |
之后,再右键以管理员权限
运行openvpn客户端,点击connect
进行连接即可,如下即表示连接成功,至此,整个OpenVpn的部署工作也就完成了百分之八十,但我们的最终目的是希望能在本地通过拨入vpn直接跟远程内网中的机器进行通信,再次明确目的之后,我们继续
0x10 以上是使用windows客户端来连接OpenVpn服务端,至于如何在linux中使用客户端连接OpenVpn服务端就更简单了,跟OpenVpn服务端一样,先装好OpenVpn,之后只需用openvpn工具加载对应的客户端配置文件即可,注意,是客户端配置文件,另外,此处不需要再配置服务端,单单只是用下openvpn工具而已,具体如下1
2
3
4
5
6
7
8
9
10
11# mkdir /etc/openvpn
# cd /etc/openvpn
# rz 可以直接把刚刚client的一套证书丢上去
# tree ./
├── ca.crt
├── client.conf
├── client.crt
└── client.key
# 断开以后,第二次重连可能会有些问题,把客户端配置文件改个名就好了
# /usr/local/sbin/openvpn --config /etc/openvpn/client.conf &
0x11 再回到我们的最终目的上,如何在本地通过vpn直接跟远程内网进行通信
,方式大概有三种,如下
第一种,把所有要通信的远程内网中的机器的网关都指向OpenVpn服务器的ip,这样,包在回传的时候就能找到本地机器,为了防止重启即失效,可直接把命令放在rc.local
中1
2# route add default gw 192.168.7.39 在OpenVpnClient上添加如下指向
# route -n
第二种,走网段路由,在所有要通信的内网的机器上添加如下路由,把来自vpn内网段的数据都直接丢到OpenVpn服务器指定的内网ip上,一样也可以达到目的,但两种方式有个共同的确定,机器比较少的情况下也许还能凑活,如果有几千台机器,每台上都要添加一条这样的指向毕竟是很不现实的1
2# route add -net 10.18.0.0/24 gw 192.168.7.39 在OpenVpnClient上添加如下指向
# route -n
所以,我们再来看第三种,利用iptables进行NAT转换,即把源地址为10.18.0.0/24
都转换到指定的内网卡ip上,这样就不用再逐个指定网关了1
2
3
4# /etc/init.d/iptables status 只需在OpenVpnServer服务器上添加如下规则即可
# /sbin/iptables -t nat -A POSTROUTING -s 10.18.0.0/24 -o eth2 -j SNAT --to-source 192.168.7.39 添加规则
# /sbin/iptables -t nat -D POSTROUTING -s 10.18.0.0/24 -o eth2 -j SNAT --to-source 192.168.7.39 删除规则
# /etc/init.d/iptables stop
0x12 实际生产环境中,由于各种各样的原因,有时可能还需要禁止指定的客户端用户登陆,方法非常简单,直接注销指定的客户端证书,万一要连续禁用多个vpn账号,那就直接一次性注销多个客户端证书,执行revoke-full后直接覆盖原来的crl.pem文件即可,如下1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17# cd /root/openvpn-2.2.2/easy-rsa/2.0
# source vars
# vi /root/openvpn-2.2.2/easy-rsa/2.0/openssl-1.0.0.cnf
# tail -n 6 /root/openvpn-2.2.2/easy-rsa/2.0/openssl-1.0.0.cnf 先注释如下行
#[ pkcs11_section ]
#engine_id = pkcs11
#dynamic_path = /usr/lib/engines/engine_pkcs11.so
#MODULE_PATH = $ENV::PKCS11_MODULE_PATH
#PIN = $ENV::PKCS11_PIN
#init = 0
# ./revoke-full client 指定要注销的客户端用户执行注销
# cat keys/crl.pem
# cat keys/index.txt 从该文件中可看到客户端用户的状态,R为已注销
# cp keys/crl.pem /etc/openvpn/keys/
# vi /etc/openvpn/server.conf 再到主配置文件中添加该pem文件位置,然后重启openvpn,该用户登陆即会失效
crl-verify /etc/openvpn/keys/crl.pem
# /etc/init.d/openvpn restart
下面是vpn账户被禁用后再登陆的效果,你会发现客户端的连接在一直被reset掉
后话:1
2
3
4vpn作为直插目标内部的一个最直接的入口,也颇受入侵者的热爱,尤其是对各种APT团队来讲更是如此,针对此所进行的各种形式的钓鱼也从未休止
其实,关于openvpn自身的漏洞并不多,甚至可以说,几乎没有,有也只是一些第三方库的,另外,基本也不存在什么错误配置能辅助我们渗透的
关于openvpn的内部通信过程,大家可自行拿wireshark&tcpdump仔细好好跟一下基本就看明白了,如果真想深入研究建议直接去阅读2.2的源码
在部署上基本无任何技术含量,只是为了方便大家用,顺便给自己做个备忘,保证后续随时能用即可
Web渗透第一步之信息搜集 [Win 2008 配置Pptp]
0x01 什么是vpn:1
2
3
4学名称虚拟专网,即在公共网络中搭建的一条专有通道
当用户连接到vpn服务器时,只需提供正确的账号密码即可进入到这条专用通道内,之后所有的通信数据也都会被这层通道包裹着来回传输
上面这样说可能有点儿不太形象,你可以把它想成我们之前所说的正向代理,或者'翻墙'
当然啦,vpn的用途远远不止这点,下面我们开始细说
下面是一些vpn应用场景:1
2
3
4
5
6
71,公司员工想在家里通过公网直接访问到公司内网的服务器,即远程办公
2,学生放假回家,想在家里直接通过公网访问到自己学校内网的图书馆网站查阅资料
3,公司有好几个机房,现在有需求,希望把分布在各地的机房内的机器都连到同一个内网中(当然啦,域也是一种方案)
4,大型跨国组织公司想把分布在不同国家不同地域的分支机构连到同一个内网中,方便大家处理公司业务
5,通过各种类型的vpn隧道来bypass掉天朝的gfw
6,入侵者希望通过vpn来暂时性的隐匿自己[你知道的,tor也许会更好,有机会再说]……
7,等等……
0x02 一些常见的vpn隧道协议:1
2
3
4PPTP: 点对点隧道协议,其将控制包与数据包分开,控制包采用TCP控制,加密通信,搭建过程极其方便简单,非常适合个人使用
L2TP: PPTP和L2TP两种连接类型在性能上差别不大,可以把L2TP理解成pptp的升级版,如果使用PPTP不正常,可更换为L2TP
IPSEC(Openswan):把来回通信的数据加密放到隧道中传输,然后就是正常的封装和解封装过程,防止中间人窃听,常用于多个不同地域的机房内网互连
SSLVpn(openvpn):它的技术核心是虚拟网卡,基于SSL协议(加密库)实现,这也意味着它全程通信加密,而且非常稳定,也是个人极力推荐可用于实战渗透用途的vpn,跟其它vpn有些不一样的是,它属于C/S架构软件[即需要客户端和服务端],深入的通信过程还是比较复杂的,这里就不细说了,搭建自然也会稍微繁琐一点
0x03 接下来,我们就来简单搞搞清楚vpn的大致工作流程,为了让大家能够快速理解这个东西,会尽量说的比较简单通俗一些,当然,vpn具体的工作细节还是非常复杂的,不过,那并不是咱们今天的重点,我们只需要会搭建,会使用,能排一些简单的错[会看日志]即可,暂时不必过于深究协议层的东西,毕竟,你并非想自己开发各类vpn工具,大多时候学习亦是如此,要取舍得当,别偏离重点了就行,下面是我用自己的话对vpn工作特性的一点简要叙述,可能听着不太专业,但目的也是为了让大家更好的去理解,毕竟我们并不是在搞学术研究,所以,大可不必在一些专业名词上死扣,那样对我们的实际技术的提高其实并没有多大帮助,不是吗,废话说完,咱们就来粗略走一遍vpn的通信过程:1
2
3
4
5
6
7正常情况下我们和公网进行的任何通信,都必须先通过本地'网关'出去,再通过'网关'回来[俗称nat转换]
你可以暂时把vpn想成你家里的路由器,因为它们在功能上有些类似,我们知道,在家里,正常上网的情况下是通过本地路由网关实现的
但一旦你连上了vpn,以后上网的网关就不再是你家里路由器上的那个了,而是你vpn服务器上的'vpn网关'
因为在你拨通vpn以后,你的机器就会进入到vpn的内网中,而这个网关自然就变成了vpn服务器上的那个网关
也就是说你和公网进行的任何通信都要先交给vpn网关,回来的数据再通过vpn网关[nat],经过vpn隧道响应给你
举个简单的例子,当你挂上vpn以后去访问某个网站,用于解析域名的dns,其实是你vpn服务器所在的ip的当地的dns服务器
这样看来,也就不难理解为什么vpn会慢了,因为你每次请求响应都要经过两层节点,家的路由器网关和vpn网关,数据也都是通过包裹[封装]在vpn隧道中返回给你的
0x04 vpn对于我们实际渗透的意义,至于它在真实生产环境的好处,这里就不说了,可自行谷歌,对于一些大型跨国公司或组织,vpn还是一种比较靠谱的协作方案1
2
3
41)隐藏入侵者真实ip,作为入侵者的第一道保护屏障,能熟练快速配置各类vpn是每个入侵者最基本的基本功,如果条件允许的话,你甚至可以多套几层vpn,无疑,这样速度肯定也会慢很多
2)加大目标溯源取证的难度和成本
3)灵活性好,主要是拥有了一台自己可以随意操作的公网ip,这样在实际渗透中会帮我们很多的忙
4)是所有入侵者,真正走向入侵的第一步
0x05 理解了vpn大致的工作流程以后,具体的配置就非常简单了,这里暂时以win下的pptp为例,进行一些实际的搭建配置1
2
3
4
5
6
7
8因为用vpn的主要目的还是为了保护我们自己,所以对于vpn的宿主系统,一系列的安全策略是非常必要的,比如,在win中你可以通过tcp/ip筛选限制3389[端口最好不要默认],vpn,还有你自己经常要用的这几个端口流量可以正常进出,其余的端口一律禁止,另外,启用系统禁ping,尽可能防止别人ddos,最好不要再在vpn服务器上同时搭建别的服务,尽可能减少别人下手的机会,总之,跑的东西越少越好,恪守'最少服务'原则,当然,如果别人手里有个可以随意远程溢出的0day,那就没什么好说的了,要想真正彻底防住,几乎是不太现实的,我们只能尽自己的能力,尽可能的保护自己,最后建议大家在实际渗透中全部用英文系统,具体原因你应该懂的,对了,还有防火墙,你可以根据自己的实际需求来,开了筛选,其实防火墙你就可以不用开了……
尽可能的禁用掉系统和vpn的各种日志审核记录功能及其所对应的服务,在系统里留的日志越少越好(防止被反渗透),记得定时上去看下日志,如果没看到什么特别的情况,定时把日志清空一下,方便自己分析
条件允许的情况下,务必把系统补丁打到最新,改掉rdp的默认端口,用户密码要严格遵守复杂性要求,大小写数字特殊字符随机排列,越随机越好,长度推荐至少12位以上,防止无聊的人爆破,如果是团队共用vps,密码最好一个人知道就可以了,严禁管理权限泛滥……
推荐在vpn上装个wireshark,可以时常去看看机器流量,或者留个隐蔽点的监控脚本也行,尽可能防止被别人反桶回来,不要以为哪些只是电影里才会出现的场景[很正常的情况],谨慎小心,方得永生……
切记千万不要在vps上保留任何容易暴露私人信息的任何东西,这极度,非常,特别重要,包括在各种工具里的有可能暴露私人信息的特征也务必要全部清干净……
用于入侵的vps,推荐一个月换一次,最迟两月换一次,换机房,换ip段,换国家,搞定一个项目后,最好把vps系统也都重装一下,买vps,尽量找一些靠谱的厂商,擦亮你的眼睛,这个也非常重要……
尽量不要经常利用vps进行任何大流量的动作,其实,在大多数的入侵过程下,我们根本没必要大规模持久性扫描,极易容易触发报警而被机房封,如果你经常干这事儿,只能说明你的入侵思路可能有问题,不妨多换换姿势,一般工具能扫出来的洞,基本人工很快也能看到了,好了,忍不住多说了一句废话,这方面的东西,后面还会大量的篇幅专门进行说明,这里就先到此为止吧
上面提供的仅仅都是一些极其简单的参考建议,其他更多的注意事项,最终还是要根据您自己的实际需求来……
0x06 说完简单的注意事项后,我们准备开始真正在windows server 2008R2上配置pptp vpn
1)首先,找到’服务’,关闭并禁用 “windows防火墙” ,将’远程路由’设为自启动,之后重启系统(防火墙关了以后,最好重启下)
2)重启完毕进入系统,打开’服务器管理器’,找到’角色’,点击’添加角色’,勾选’网络策略和访问服务’,然后再勾选’路由和远程访问’,点击’安装’
3)下面是具体的安装过程和安装完成后的状态,安装完成后点击关闭,回到’服务器管理器’中
4)安装过程中如果没什么问题,我们就开始配置pptp,到’服务器管理器’中,右键’路由远程访问’,点击’配置启用远程路由访问’,选择’自定义配置’
5)勾选’vpn’和’nat’ ,点击完成,即可开始自动安装并启动vpn服务,中间会提示个警告,说网络策略服务冲突,因为我们根本没配置nps,所以就不用管它了
6)选择启动服务,启动以后它会应用刚才的配置到服务中,配置完成后,vpn的配置界面就会自动跳出来
7)此时右键’路由和远程访问’,选择’属性’,找到’ipv4’选项,设置为’静态ip地址池’[这个ip地址池其实就是vpn的内网ip段],并禁用该选项日志记录功能
8)在下面的’ipv4’中,找到’公共’选项,右键属性,禁用该项日志
9)右键 ‘igmp属性’,禁用该项日志
10)右键’nat’,新建网卡接口,这里有两个接口,一个外网卡,一个内网卡,这一步非常关键,一定要在内网卡上启用nat
(1)首先,新建外部网卡接口,’internal’,从名字也应该能判断,这个肯定是用于公网通信的外网卡
(2)之后再右键新建网卡建接口,这个网卡是用于vpn内网通信的内网卡,记得务必在此网卡上勾选启用’nat’
11) 至此,pptp vpn服务端就算搭建配置完成了,不过,现在我们还没有用于登陆vpn的账号密码,所以,需要先新建一个系统用户(没错,win下的pptp vpn用户直接就是系统用户),并赋予其拨入权限,记得一定要用户给拨入权限,要不然客户端是拨不上的,其实,到这里你可能会忍不住多想一下,既然vpn用的是系统用户,如果目标也配置并开启了vpn服务,我们是不是可以直接给它的管理员悄悄的赋予下拨入权限,然后作为我们进一步渗透内网的桥梁岂不是很好,这里我们暂时先这样想着,后续,还会有大量的篇幅对这些东西进行详细的说明
12) 看下pptp服务器所在的ip,然后开始到客户端系统中配置vpn,进行连接测试,这里以win7作为客户端系统,看到vpn已正常连接,在客户端系统中也会多一个ip,其实就是vpn内网ip地址池里设置好的ip段,之后再在win7上ping下vpn服务器的内网ip,看看能不能通,能通基本就没什么问题了
13) 这时,我们在服务器端已经看到有一个vpn客户端在线,pptp的默认端口是1723
一些小结:
至此,在windows 2008上的pptp vpn配置基本就全部完成了,可以看到,整个过程并没什么实际的技术含量,在这儿也就不多做说明了,当然vpn对我们的作用也并非仅限于于此,后面在实际的渗透过程中,还有更详细的说明,虽然这次是在2008上配置的,但和在2003,2012上配置pptp几乎没什么区别,基本流程都差不多,最多可能安装的地方不太一样,希望大家能举一反三,多尝试,熟了就好了
Web渗透第一步之信息搜集[ubuntu 14.04LTS 快速安装配置Pptp]
0x01 一点安装配置前的准备工作:1
先最小化安装好ubuntu server 14.04 LTS,除了ssh,尽量不要再勾选其它的系统服务,顺手做些简单的系统安全优化,尽量保证跳板系统的纯净
0x02 关于vpn的具体用途,在前面已有详细说明,此处不再赘述,下面只会专门说明如何在linux(暂以ubuntu14.04为例)中快速搭建配置pptp
1)首先,到Ubuntu中安装好pptp服务端1
2
3# apt-get install pptpd -y
# apt-get update
# echo $?
2)服务端安装完成后,我们就可以开始配置pptpd了,先看下本机ip[实际中应该是你自己vps的公网ip
],因为等会儿要把这个写到pptp主配置文件中1
# ifconfig -a
3)编辑pptpd 主配置文件,设置好本机ip和vpn 的内网iP地址池(分配vpn的内网ip要用)1
# vi /etc/pptpd.conf
1 | localip 192.168.3.185 本机ip,实际用的vps,那这里就写vps的公网ip |
4)编辑pptpd的dns配置文件,设置好用于解析的dns服务器ip,推荐用谷歌的8.8.8.81
# vi /etc/ppp/pptpd-options
1 | ms-dns 8.8.8.8 |
5) 添加系统用户,没错,在linux中pptp也直接用的是系统用户,作为我们的vpn登录账户[不过,大多数可能都是nologin的]1
2# useradd xlion -s /usr/sbin/nologin
# passwd xlion
6) 把该账号密码添加到对应的pptp配置文件中,格式: username pptpd password *,如下:1
2# vi /etc/ppp/chap-secrets
xlion pptpd admin *
7) 重启pptpd服务,先看下服务到底有没有起来,不用急着连1
2# /etc/init.d/pptpd restart
# netstat -tulnp | grep "1723"
8) 编辑sysctl.conf 文件,开启系统的路由转发功能,如下1
2# vi /etc/sysctl.conf
net.ipv4.ip_forward=1 将ip_forward 值改为 1
1 | # sysctl -p 重新读取sysctl配置 |
9) 如果你已经安装并且开启了iptables,可以顺手把下面的规则加进去,否则,你可能会发现,vpn确实能正常连上,但死活上不了外网,其实原因很简单,你需要在vpn的这个内网段上做下nat,具体如下,这里的ip段是vpn的内网ip段,网卡接口是外网卡接口,意思就是在这个网卡上启用nat1
2# apt-get install iptables
# iptables -t nat -A POSTROUTING -s 172.16.110.0/24 -o eth0 -j MASQUERADE
1 | 设置下mtu,正常情况下1200即可,防止包过大,可以不用设置 |
10) 让pptpd 服务随系统自启动1
# update-rc.d pptpd enable
11) 开始配置客户端,进行连接测试,有时候,你可能会遇到这样的情况,虽然pptp客户端是连接成功了,但无法正常上网,ping的结果显示超时,绝大多数原因都是防火墙在搞鬼,你可以利用下面的命令直接把防火墙关掉,或者允许1723端口能正常进出应该就没问题了,至此,在ubuntu 14.04 LTS中搭建配置pptpd基本就算完成了1
2
3
4# ufw status
# ufw disable 停止防火墙并删除自启动
# ufw allow 1723 允许外部的1723端口访问
# ufw delete allow 1723 禁止外部访问本机的1723端口
12) 是不是觉得手敲命令太枯燥了呢,把它写成shell脚本吧,其实非常简单,稍微把命令堆砌调整一下即可,稍后会把自己的脚本都提供给大家,可根据自己的实际需求再稍微改下
一些小结:
通观全文并没什么实际的技术含量,安装配置和win下基本也没有太大差别,只不过一个是靠图形界面,另一个是靠改配置文件来完成的,完全是看个人习惯,可能我自己比较习惯linux,所以更喜欢在linux中配置pptp,如果你觉得windows比较方便,那你就直接在windows上配置就好了,前提是要严格遵循前面所提到的一些关于系统的各种安全策略配置,不同的系统平台策略设置可能不太一样,后面会有专门的篇幅来讲解linux系统的安全部署,这里只要暂时能满足把服务先跑起来能用上即可,关于安全部署方面的东西,后面再详细说,因为你vpn宿主系统的安全也会直接关系到你自己的安全,大家可能在这上面还要多花点儿心思才是,也不早了,睡觉,安……!
深入透彻理解 Sql注入
0x01 首先,创建测试库,表,准备好测试数据:
建库:1
2
3
4C:\>mysql -uroot -p
mysql> create database sqli;
mysql> show databases;
mysql> use sqli;
建表 personal_info(人员信息表),admin(假设为网站管理表,里面存的是网站后台管理员的账号密码):1
2
3
4
5
6
7
8
9
10
11
12mysql> create table if not exists `personal_info`(
-> `id` int unsigned not null auto_increment,
-> `name` varchar(50) not null,
-> `age` int not null,
-> `phonenu` varchar(20) not null unique,
-> `email` varchar(20) not null unique,
-> `sex` varchar(20) not null default 'man',
-> `birthday` date not null default '1991-01-01',
-> primary key(`id`),
-> index username_index(`name`),
-> index userpass_index(`phonenu`)
-> )ENGINE=MyISAM DEFAULT CHARSET=utf8 collate utf8_general_ci;
1 | mysql> create table if not exists `admin`( |
0x02 理解 sql注入产生的根因:
脚本在接收前台传过来的数据时,没有对该数据进行很好的安全检查就直接丢到数据库中去操作,导致入侵者在前台随正常数据一起提交过来的恶意sql语句也被一并带入数据库中执行[各种子查询,联合查询…],也就是说,注入的本质,只是数据库本身,与后端脚本,系统平台无关
0x03 我们利用 sql注入到底可以干些什么1
在当前数据库用户权限够的时候,一般为数据库管理员
1 | 执行系统命令,但这并不直接就等于’提权’,具体权限的大小还要取决于你服务用户的系统权限 |
1 | 在当前数据库用户权限一般的时候,比如,只能在指定的库中进行正常的增删改查 |
1 | 像这种情况,一般我们可能会尝试查出目标网站管理员的账号和密码hash,然后再登到后台传webshell |
0x04 先理解一些最简单的sql注入漏洞语句原型及闭合方法:
最常见的 select 查询注入:
关于select 的注入,也可能会是我们在实战中遇到的最多的一种注入语句,实际上在前端涉及增删改的操作一般都非常少,除非像那种论坛程序,对于大多数普通的cms而言,前端用户的大多数操作可能都是在点击链接,然后把对应的参数值传给后端脚本,然后脚本再到数据库中去查,之后再把查询的结果返回给前端页面显示给用户
1 | 标准数字型注入语句: |
1 | 标准字符型注入语句: |
1 | 各种常见的登陆框注入漏洞原型sql语句: |
1 | 针对各类搜索框注入的漏洞原型sql语句: |
insert 注入利用核心:
因为一些功能需求,在前端可能会有很多需要录入各种用户信息的表单,丢给后端脚本以后,脚本会把传过来的这些数据再插到数据库,例如典型的基于各种形式的个人中心功能,一旦遇到了,都可以随便尝试insert注入,注意,想成功利用insert注入有个必要的前提,就是你一定要知道自己插入的数据在前端的什么地方显示,如果别人只是单单搜集用户信息,然后插到数据库中,并没有在前端页面上显示,即使你知道它存在insert注入也是个鸡肋
1 | 漏洞语句原型: |
update 注入利用核心:
关于update利用的点有两个,一个是在set的时候,如果set的是一个从前端传过来的变量,结果可想而知,另一个则是where后面的条件,因为这个条件也是可以从前端传过来的,这个后果想必就应该清楚了,相对于insert可能会比较麻烦的一点的是,update一般都是在set一个新值,这也就意味着我们在闭合的时候,在前端很可能是没有任何回显的,这样的话我们在实际查询数据的时候可能就要费点儿劲了,具体利用过程如下
1 | 漏洞原型语句: |
关于对delete注入的利用:
对于delete语句,我们唯一能控制的地方可能就只有where后面的条件了,清晰明白这一点之后,剩下的事情就很好办了,说实话,在现在的web程序里,在前台涉及到delete的操作非常少,可以说几乎是没有,不过有时还是可以在后台尝试下,尤其在权限特别高的时候,至于怎么利用它来查数据,跟update差不太多,基本也是靠报错或者盲注来搞,具体利用过程如下1
2
3
4
5漏洞原型sql语句:
mysql> delete from personal_info where id='fedora';
针对性注入利用,这个闭合其实跟select的时候差不多,无非就是数字或者字符串,数字就不存在什么闭合了,如果是字符串,注意闭合掉前后的单引号即可
mysql> delete from personal_info where id='fedora' or (select 1 from (select count(*),Concat((select database()),0x3a,floor(rand(0)*2))y from information_schema.tables group by y)x) -- +';
0x05 在对sql注入有了基本的了解之后,再来详细看看到底哪些地方容易出现sql注入,实战知道从哪儿入手1
2
3
4
5
6
7
8get请求的url,正常情况下这里应该是最先会尝试的地方
post数据字段中,数据较多时一般都会用post传,会是个不错的入手点
cookie中传的数据,有些还可能会把一些参数放在cookie中传,所以这儿也会是个不错的入手点
Referer本身用来记录上一个页面的url,但一旦被存到数据库中之后又被带入查询,你懂的
User-agent 本身用来记录客户端信息,只要被记录到数据库之后又被带入查询一样可被利用
X-Forwarded-For 本身专门用来记录客户端真实ip,如果脚本在处理时把它也带到数据库中去查询...
宽字节[双字节], 主要是由于前后端编码不统一造成理解歧义
只要是你发现会和后端数据库交互的地方全都可以随便尝试,并不仅限于我上面提到的这些...
0x06 最后,再来简单看下几种主流关系数据库的报错信息都大概是个什么样子,先混个脸熟,后面会再详细说1
2Mysql:
ERROR 1064 (42000): You have an error in your SQL syntax;
1 | Mssql: |
1 | Oracle: |
1 | Postgresql: |
1 | Sqlite3: |
0x07 下一阶段准备
关于sql注入的基础科普就先简单到这里了,接下来,会再专门针对每种数据库具体的手工注入方法及注意事项做更详细的说明,待续…
初识网络安全
0x01 本次内容要点快速预览1
2
3
4
5
6
7
8
9
10
11如何正确地理解 '网络安全'! 此'网络安全' = 彼'网络安全'? 渗透? 入侵? 攻击? apt?
网络安全所涉及到的一些具体技术领域
掌握相关领域技能所需要事先具备的一些必要基础
熟悉圈子内约定俗成的一些 ’术语’,方便日后同别人协作沟通
推荐几本相对比较有实用价值的安全书刊,仅以此作为入门学习参考之用
另外,再推荐一些相对比较靠谱的安全社区及个人博客,方便大家快速获取业内信息及学习
了解常用的一些渗透系统平台
简要说明Web及内网常规渗透流程
其它,问题集中讨论
注: 此次分享,无任何实操环节,仅作为入门概念科普之用
0x02 网络安全所涉及到的一些领域,站在不同的角度来看,大致就如下这些
单从入侵方来看 [ 主要以获取目标机器最高权限为最终目的 ]:1
2
3
4
5
6Web 安全 [ web并非仅限于传统意义上的标准网站,如各类oa系统,webmail它们同样都属于web范畴,包括一些并非工作在默认端口上的web服务... ]
web渗透,利用各类传统高危web漏洞专门从事web入侵,关于最新web top 10漏洞详情可自行参考owasp
针对各种web后台脚本的常规高危漏洞挖掘 [ 代码安全审查 ] 及 exp编写
针对各主流浏览器[chrome,firefox,IE...]及web中间件[apache,IIS,tomcat,nginx,jboss,resin...]的漏洞挖掘[偏逆向]
……
1 | 网络安全 [ 含二进制 ] |
1 | 无线安全 |
1 | 移动端安全 |
1 | 工控安全 |
1 | 社工 |
再从防御方来看 [ 单纯以’技术’安全为目的,业务安全暂不包括在内 ]:
1 | Web 安全 |
1 | 网络安全 |
1 | 无线安全 |
1 | 移动安全 |
0x03 初步掌握相关渗透技能所需要具备的一些基础知识1
2
3
4
5
6Web 渗透:
熟练掌握http/https协议,比如,请求响应头部中的各个字段的具体作用务必要非常熟悉
熟练最基本的web前后端开发,如,html4/5,css2/3,原生js/及任意一款js框架,php/python/java/c#...
熟练标准sql及各类数据库的基本操作,如,mssql,mysql,oracle,postgresl,sqlite,db2...
熟练各类web中间件的基本部署配置,如,apache,nginx,tomcat,iis,resin,jboss,glassfish...
1 | 内网渗透: |
0x04 理解相关安全领域的一些基本安全 ‘术语’[漏洞类型]1
2
3
4
5
6
7
8
9
10
11
12
13Web:
信息搜集,如查找目标真实ip,利用搜索引擎快速锁定目标漏洞站点,敏感目录文件扫描,子域爆破...
Sql注入[injection], 包含[File inclusion vulnerability],远程代码或命令执行[RCE]
上传[File upload vulnerability],解析漏洞[Request line parsing vulnerability]
反序列化漏洞[Deserialization of untrusted data]
未授权访问[Broken Access Control],任意文件读取[xxe],任意文件下载...
Ssrf,信息泄露[主要是各类敏感文件源码泄露],xpath,email,ldap注入,xss,csrf...
bypass Waf, webshell,小马,大马,菜刀[webshell管理工具],免杀webshell...
打包脱裤,提权,poc[漏洞证明代码],exp[漏洞利用程序],0day[零日漏洞],src...
web漏扫,系统漏扫,爬虫[spider],钓鱼[定向攻击],端口扫描...
旁站[同服],C段,cc攻击,各类框架漏洞利用[struts2,thinkphp...],肉鸡,跳板...
...
1 | 内网: |
0x05 熟悉几个相对比较主流的渗透系统平台1
2
3
4
5Kali [基于debian,适合初学者,不稳定,维护更新较为频繁] & nethunter
Parrot Security OS [基于debian,ui炫酷,不实用]
BackBox [基于ubuntu,不稳定,系统封装还有很多问题]
PentestBox [Windows下的渗透平台,说实话,不太好用,不推荐]
Ubuntu [利用Ubuntu手工打造适合自己习惯的渗透平台,个人推荐]
0x06 推荐给大家一些相对比较靠谱的安全学习书刊,看书的时候,务必以真正吸收知识为主1
2
3
4
5
6
7
8《安全参考》《书安》... 内容相对比较基础,容易入门
《Web应用安全权威指南》 作为web渗透入门书籍还是非常值得一看的
《黑客攻防技术宝典 web实战篇》 适合多次阅读,对web安全剖析相对比较全面深入,实战性较强
《黑客大曝光 第七版》 适合作为win内网渗透入门,此外,它还详细介绍了apt团队的惯用攻击流程及招数
《Wireshark 数据包分析实战(第2版)》 用实操来熟练深刻理解各种基础协议基本运作原理
《0day安全(第2版)》 逆向分析的入门书籍,非常值得一看,内容浅显易懂
《深入理解计算机系统》 在熟练具备以上基础之后,非常值得深入的一本好书
《TCP/IP详解 卷1-3》 熟练协议分析必备,网络专家之路上的不二之选,建议上述所有内容都熟练掌握以后再来看,理解会更深
0x07 再推荐一些相对比较有价值的安全站及个人博客1
2
3
4
5
6
7
8
9
10
11
12github.com 全球程序员的殿堂,全球最大的黑客武器库,尽情享用,不用客气,嘿嘿……
adsecurity.org 专注windows域安全,里面还是有很多宝贝的,非常值得深度挖掘
pentest.blog 更新挺快的,质量还行
forum.90sec.com 老牌安全社区,较专注web和内网安全,总体来说挺不错的
www.mottoin.com 也还不错,只是暂时人可能比较少,可能是因为内容更新太慢了吧
www.pediy.com www.52pojie.cn 专业老牌的二进制社区,如果对逆向有兴趣可以多多关注这两个地方
bobao.360.cn 播报,也比较老了,不过里面还是有些比较有价值的好文章,总体来讲平台不错
xianzhi.aliyun.com 阿里先知,也还不错,立马不乏一些高质量文章
www.sec-wiki.com 窗口导航站,自由投稿,很一般
www.exploit-db.com 全球最大的exp平台
其它各大官方漏洞库,国内,境外都非常多,但可能并不是我们想要的,大多是给甲方看的
……
0x08 常规入侵流程小结
详情可参考本人总结好的脑图,其实,不管是web还是内网,大概流程上基本是一致的,如下:1
2
3
4
5
6
7
8
9-> 确定目标...
-> 搜集信息[扫描探测,社工搜集...]...
-> 查找漏洞...
-> 成功利用该漏洞进入目标系统[此时权限可能还比较低]...
-> 提权...
-> 拿到想要的各类数据...
-> 处理好日志...
-> 留上后门...
-> 长期稳控,定时维护肉鸡,组建僵尸网络,蓄势待发...
0x09 技术之外的话1
2
3
4
5
6
7
8关于安全的东西确实非常的多,想一下子全栈掌握暂时似乎还不太现实,但掌握一两个方向至少还是很有可能的
既是如此,投入大量的时间和精力在里面也是肯定的,毕竟都是慢慢积累起来的,安全嘛,说到底就是一个不断学习
不断接触熟悉掌握未知领域的过程,期间肯定会经常去尝试一些自己曾经没做过甚至都没接触过的事情,挑战是经常的
只要不抵触,不浮躁,能静下心耐着性子好好去理解,后面的路就会越来越好走,个人始终坚信 '未知攻焉知防'
一位优秀的防御者,必定也是一位顶尖的入侵者,自己也一直在朝着这方向努力,不管以后是开发各种安全产品也好
写各类渗透工具也好,专门做渗透手也好,或者去研究架构安全也罢,丰富的实战入侵经验在任何时候都是必须的
很明显,只有这样,写出来的工具,才会有更强的针对性和适应性,说了这么多,所谓的'经验'
说白点儿其实都是你自己在实战渗透中解决问题潜移默化形成的那种能力,这也是任何人都给不了你的