APT404-不作恶

在路上,一直在路上!

OpenVpn 安全部署实战指南 [一]



0x01 关于openvpn

1
2
一种基于OpenSSL加密库的开源VPN实现,此处的主要目的还是旨在说明如何快速安全部署openvpn
关于其内部的加解密细节及封装与解封装过程,相信大家都已经比较熟练了,此处不做过多涉及,暂以实战上手应用为主

0x02 openvpn 可工作于两种不同的模式,使用 TUN / TAP 作为接口建立隧道,但需要相应内核支持

1
2
3
TUN 接口创建的是三层路由隧道,实际中用的较多,TAP 是二层网卡桥接隧道,即创建一个以太网桥接,相对复杂
TAP 接口的好处在于,客户端可以获得 VPN 服务器所处子网的 IP [即,忽略物理上的区别,可以完全将客户端看做是与VPN服务器处于同一子网的另一台机器]
而TUN 接口下所有的客户端则处于一个完全独立的子网内,与 VPN 服务器所在的子网没有关系,待到后面实际部署时,会深有体会的

0x03 下面则是 openvpn 提供的两种安全模式

1
2
Static Key
X509 PKI [Public Key Infrastructure]

此次演示环境

1
2
3
4
OpenVpnServer  	  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
2
# ./build-key-pass clientsec 如果你想创建带密码的客户端证书,直接用 build-key-pass 来创建即可
# ll keys/


创建秘钥交换协议文件

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 下面是openvpn服务端的完整配置
# vi server.conf
local 192.168.3.71 # 要绑定到的公网ip
port 11941 # openvpn服务的默认端口,最好改掉,其实,别人如果全端口扫描还是能扫到
proto tcp # 使用tcp协议,相对稳定
dev tun # 此处使用tun接口
ca /etc/openvpn/keys/ca.crt # ca证书路径
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key # openvpn服务端证书路径
dh /etc/openvpn/keys/dh1024.pem
server 10.18.0.0 255.255.255.0 # openvpn内网ip地址池
push "route 192.168.6.0 255.255.255.0" # 此项非常重要,即vpn服务器所在的内网段
push "route 192.168.7.0 255.255.255.0" # 如果想让别人拨入成功后能直接跟vpn所在的内网段的机器进行通信,就需要用此方式把配置推到每个客户端
client-to-client # 让openvpn客户端和客户端能相互通信
duplicate-cn # 同一个vpn账号允许同时多点登陆,在上面已经提到过
ifconfig-pool-persist ipp.txt
keepalive 10 120 # 发心跳包,每10一次,如果超过120秒都没动静,就自动断开
comp-lzo # 启用传输数据压缩
persist-key
persist-tun
status openvpn-status.log # 开启OpenVpn服务端日志
log /var/log/openvpn.log # 指定日志存放位置
verb 3 # 指定记录的日志级别

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
2
ca.crt client.crt client.key  	所有要复制的文件
C:\Program Files\OpenVPN\config 要复制到的目录



1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 手工创建好客户端配置文件,文件具体内容如下,注意在windows中客户端配置文件名必须为 client.ovpn 

client # 声明是客户端
dev tun # 和服务端保持一致,使用tun接口
proto tcp # 同样使用tcp协议,保持一致,不然就没法和服务端进行正常通信了
remote 192.168.3.71 11941 # Openvpn 服务端的ip和端口
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt # 客户端证书所在路径
cert client.crt
key client.key
ns-cert-type server
comp-lzo # 压缩传输
verb 3

之后,再右键以管理员权限运行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
4
vpn作为直插目标内部的一个最直接的入口,也颇受入侵者的热爱,尤其是对各种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
7
1,公司员工想在家里通过公网直接访问到公司内网的服务器,即远程办公
2,学生放假回家,想在家里直接通过公网访问到自己学校内网的图书馆网站查阅资料
3,公司有好几个机房,现在有需求,希望把分布在各地的机房内的机器都连到同一个内网中(当然啦,域也是一种方案)
4,大型跨国组织公司想把分布在不同国家不同地域的分支机构连到同一个内网中,方便大家处理公司业务
5,通过各种类型的vpn隧道来bypass掉天朝的gfw
6,入侵者希望通过vpn来暂时性的隐匿自己[你知道的,tor也许会更好,有机会再说]……
7,等等……

0x02 一些常见的vpn隧道协议:

1
2
3
4
PPTP: 点对点隧道协议,其将控制包与数据包分开,控制包采用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
4
1)隐藏入侵者真实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
2
localip 192.168.3.185        本机ip,实际用的vps,那这里就写vps的公网ip
remoteip 172.16.110.1-20 设置vpn的内网ip地址池

4)编辑pptpd的dns配置文件,设置好用于解析的dns服务器ip,推荐用谷歌的8.8.8.8

1
# vi /etc/ppp/pptpd-options

1
2
ms-dns 8.8.8.8
ms-dns 114.114.114.114

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段,网卡接口是外网卡接口,意思就是在这个网卡上启用nat

1
2
# apt-get install iptables
# iptables -t nat -A POSTROUTING -s 172.16.110.0/24 -o eth0 -j MASQUERADE

1
2
3
4
设置下mtu,正常情况下1200即可,防止包过大,可以不用设置
# iptables -A FORWARD -s 172.16.110.0/24 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1200
# iptables-save > /etc/iptables-rules
# /etc/init.d/pptpd restart

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
4
C:\>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
12
mysql> 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
2
3
4
5
6
7
8
9
mysql> create table if not exists `admin`(
-> `id` int unsigned not null auto_increment,
-> `username` varchar(50) not null,
-> `passwd` varchar(50) not null,
-> `email` varchar(20) not null unique,
-> primary key(`id`),
-> index username_index(`username`),
-> index userpass_index(`passwd`)
-> )ENGINE=MyISAM DEFAULT CHARSET=utf8 collate utf8_general_ci;

0x02 理解 sql注入产生的根因:
    脚本在接收前台传过来的数据时,没有对该数据进行很好的安全检查就直接丢到数据库中去操作,导致入侵者在前台随正常数据一起提交过来的恶意sql语句也被一并带入数据库中执行[各种子查询,联合查询…],也就是说,注入的本质,只是数据库本身,与后端脚本,系统平台无关

0x03 我们利用 sql注入到底可以干些什么

1
在当前数据库用户权限够的时候,一般为数据库管理员

1
2
3
执行系统命令,但这并不直接就等于’提权’,具体权限的大小还要取决于你服务用户的系统权限
写文件,比如,我们可能会尝试往目标网站目录中写webshell,但能不能写进去,还要看目录具体权限
读文件,尝试读取带有账号密码的各类敏感配置文件,然后再想办法配合其它的漏洞一起利用
1
在当前数据库用户权限一般的时候,比如,只能在指定的库中进行正常的增删改查
1
2
像这种情况,一般我们可能会尝试查出目标网站管理员的账号和密码hash,然后再登到后台传webshell
或者搜集各种能搜集到[有权限]的各类用户密码数据,时刻为后面的字典作准备,以备不时之需

0x04 先理解一些最简单的sql注入漏洞语句原型及闭合方法:

最常见的 select 查询注入:
    关于select 的注入,也可能会是我们在实战中遇到的最多的一种注入语句,实际上在前端涉及增删改的操作一般都非常少,除非像那种论坛程序,对于大多数普通的cms而言,前端用户的大多数操作可能都是在点击链接,然后把对应的参数值传给后端脚本,然后脚本再到数据库中去查,之后再把查询的结果返回给前端页面显示给用户

1
2
3
4
5
标准数字型注入语句:
mysql> select * from personal_info where id=3;

数字型sql注入利用,数字嘛,也不存在什么闭合,直接跟上sql,就可以一下就把网站管理员的账号密码都查出来:
mysql> select * from personal_info where id=-3 union select username,passwd,3,4,5,6,7 from admin;
1
2
3
4
5
标准字符型注入语句:
mysql> select * from personal_info where name='fedora';

字符型sql注入利用,想办法闭合单引号,and后面可随意跟上各种子查询就可以把所有数据遍历出来了
mysql> select * from personal_info where name='fedora' and 12=12 -- -; '
1
2
3
4
5
各种常见的登陆框注入漏洞原型sql语句:
mysql> select * from admin where username='admin' and passwd='abc123';

具体利用方法如下,依然是闭合前面注释后面,在and后面跟上各种子查询,直到把所有想要的数据都遍历出来:
mysql> select * from admin where username='admin' and 12=12 -- - passwd='abc123';
1
2
3
4
5
针对各类搜索框注入的漏洞原型sql语句:
mysql> select * from personal_info where name like '%ka%';

具体利用方法 也非常简单,只需要前后的单引号和通配符都闭合掉即可保证语句的正常执行
mysql> select * from personal_info where name like '%%' and 12=12 -- +%';

insert 注入利用核心:
    因为一些功能需求,在前端可能会有很多需要录入各种用户信息的表单,丢给后端脚本以后,脚本会把传过来的这些数据再插到数据库,例如典型的基于各种形式的个人中心功能,一旦遇到了,都可以随便尝试insert注入,注意,想成功利用insert注入有个必要的前提,就是你一定要知道自己插入的数据在前端的什么地方显示,如果别人只是单单搜集用户信息,然后插到数据库中,并没有在前端页面上显示,即使你知道它存在insert注入也是个鸡肋

1
2
3
4
5
漏洞语句原型:
mysql> insert into personal_info(*) values('injection',123,'123456789011','sqli@inection.org','man','0000-00-00');

利用如下,注意这里的闭合方法,insert前后字段的个数和数据类型务必一致,不然是闭合不了的,具体该怎么确定字段个数呢,其实很简单,你就一位位的字段递增,直到它返回正常为止,然后再在爆出来的字段上查数据就可以了
mysql> insert into personal_info(name,age,phonenu,email,sex,birthday) values('injection',1,2,3,4,5)-- -123,'123456789011','sqli@inection.org','man','0000-00-00');

update 注入利用核心:
    关于update利用的点有两个,一个是在set的时候,如果set的是一个从前端传过来的变量,结果可想而知,另一个则是where后面的条件,因为这个条件也是可以从前端传过来的,这个后果想必就应该清楚了,相对于insert可能会比较麻烦的一点的是,update一般都是在set一个新值,这也就意味着我们在闭合的时候,在前端很可能是没有任何回显的,这样的话我们在实际查询数据的时候可能就要费点儿劲了,具体利用过程如下

1
2
3
4
5
漏洞原型语句:
mysql> update personal_info set email = 'flow@yeah.net' where name='fedora';

漏洞利用语句,其实,这里是利用mysql自身的报错特性来查数据的,但大多数情况下,稍微有点儿尝试的目标站一般都会接收页面错误,这时你依然可以利用盲注的来查数据,方法大同小异
mysql> update personal_info set email=''*(select 1 from(select count(*),concat((select (select (select concat(0x7e,database(),0x7e))) from information_schema.tables limit 0,1),floor(rand(0)*2))x from information_schema.tables group by x)a)* '' where name='fedora';

关于对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
8
get请求的url,正常情况下这里应该是最先会尝试的地方
post数据字段中,数据较多时一般都会用post传,会是个不错的入手点
cookie中传的数据,有些还可能会把一些参数放在cookie中传,所以这儿也会是个不错的入手点
Referer本身用来记录上一个页面的url,但一旦被存到数据库中之后又被带入查询,你懂的
User-agent 本身用来记录客户端信息,只要被记录到数据库之后又被带入查询一样可被利用
X-Forwarded-For 本身专门用来记录客户端真实ip,如果脚本在处理时把它也带到数据库中去查询...
宽字节[双字节], 主要是由于前后端编码不统一造成理解歧义
只要是你发现会和后端数据库交互的地方全都可以随便尝试,并不仅限于我上面提到的这些...

0x06 最后,再来简单看下几种主流关系数据库的报错信息都大概是个什么样子,先混个脸熟,后面会再详细说

1
2
Mysql:
ERROR 1064 (42000): You have an error in your SQL syntax;

1
2
3
Mssql:
Server Error in '/sportpavilion' Application.
Unclosed quotation mark after the character string ''.
1
2
Oracle:
[Oracle][ODBC][Ora]ORA-01756:
1
2
Postgresql:
Warning: pg_query() [function.pg-query]: Query failed: ERROR: syntax error at or near "\" at character 53
1
2
Sqlite3:
Error: HY000

0x07 下一阶段准备
    关于sql注入的基础科普就先简单到这里了,接下来,会再专门针对每种数据库具体的手工注入方法及注意事项做更详细的说明,待续…


初识网络安全



0x01 本次内容要点快速预览

1
2
3
4
5
6
7
8
9
10
11
如何正确地理解 '网络安全'! 此'网络安全' = 彼'网络安全'? 渗透? 入侵? 攻击? apt?
网络安全所涉及到的一些具体技术领域
掌握相关领域技能所需要事先具备的一些必要基础
熟悉圈子内约定俗成的一些 ’术语’,方便日后同别人协作沟通
推荐几本相对比较有实用价值的安全书刊,仅以此作为入门学习参考之用
另外,再推荐一些相对比较靠谱的安全社区及个人博客,方便大家快速获取业内信息及学习
了解常用的一些渗透系统平台
简要说明Web及内网常规渗透流程
其它,问题集中讨论

注: 此次分享,无任何实操环节,仅作为入门概念科普之用

0x02 网络安全所涉及到的一些领域,站在不同的角度来看,大致就如下这些

单从入侵方来看 [ 主要以获取目标机器最高权限为最终目的 ]:

1
2
3
4
5
6
Web 安全 [ 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
2
3
4
5
6
网络安全 [ 含二进制 ]

内网渗透,主要针对目标核心网[一般为办公内网或域内网]以及其它常规内网环境下的各种入侵手段...
操作系统自身的各种远程执行,远程溢出类漏洞,利用协议缺陷,各类服务配置错误,软件自身的漏洞...
针对不同平台下的高级远控及rootkit编写...[高级程序员]
协议及系统内核0day挖掘,各类工具破解,杀软及系统内核防护对抗[免杀]...[安全研究员]
1
2
3
4
无线安全

无线电,如,典型的伪基站,蜂窝数据[短信和语音流量]嗅探,无人机劫持[射频]...
利用无线热点实地入侵目标办公内网,暂时主要集中在无线密码hash快速破解及热点伪造上...
1
2
3
4
移动端安全

利用移动设备进行渗透,如,常规的nethunter平台...
各类app自身逆向 ,http/https数据分析[web渗透],android[绝大部分都是apk,已经泛滥]及ios木马...
1
2
3
工控安全

主要针对目标地区的各类公共系统设施进行入侵以达到长期控制的目的,各国APT组织的主要目标
1
2
3
4
5
6
社工

发信,即钓鱼邮件,又名鱼叉式攻击,本质其实就是花式钓鱼,方法虽然很low,但往往直接有效,前期信息搜集到位的情况下命中率也高
水坑攻击,一直跟踪目标搜集信息
撞库攻击,利用所有已泄露的海量数据,大数据查询,又名 ‘社工库’...
针对特定人的公开信息搜集调研...

再从防御方来看 [ 单纯以’技术’安全为目的,业务安全暂不包括在内 ]:

1
2
3
4
5
Web 安全

针对各类服务,中间件及脚本配置文件加固
网站实时监控,各类程序补丁升级,应急响应[主要是应对各类0day灾害及入侵事件,进行的紧急修复]...
代码安全审查,安全开发 [负责编写一些安全检测小工具及exp],各类waf,ids,ips,fw等传统安全产品开发...
1
2
3
4
网络安全

ids,ips部署,各类fw,服务及网络设备加固,日志审查,入侵取证, 恶意流量分析,反渗透溯源...
蜜罐开发部署,入侵监控,威胁情报分析[反社工]...
1
2
3
无线安全

配置加固,防火墙,隐藏无线id,禁用wps,升级固件...
1
2
3
4
移动安全

http/https数据分析,app逆向分析但'此'逆向非'彼'逆向...
...

0x03 初步掌握相关渗透技能所需要具备的一些基础知识

1
2
3
4
5
6
Web 渗透:

熟练掌握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
2
3
4
5
6
7
内网渗透:

熟练不同平台下的系统管理,如 *inux,win server
如,基本工具命令使用,用户及组管理,进程管理,磁盘管理,网络管理,各类服务管理,域内管理..
熟知各类常用协议的核心工作细节,如,http,https,dns,smb,tcp,udp,arp...
熟知不同操作系统上独有的一些特性,熟练掌握一门底层开发语言,最好是c
掌握必要的逆向基础,如,逆向分析[包含免杀破解,入侵取证,恶意流量分析,病毒分析]...

0x04 理解相关安全领域的一些基本安全 ‘术语’[漏洞类型]

1
2
3
4
5
6
7
8
9
10
11
12
13
Web:

信息搜集,如查找目标真实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
2
3
4
5
6
7
8
内网:

tcp端口转发,复用 [各类隧道,ssh,icmp,http],socks5反向代理,多级内网穿透[打洞]
Powershell,嗅探,爆破,维持访问[反弹shell,木马后门,病毒,蠕虫,免杀,rootkit],日志伪造...
域,域控,域管,抓hash,hash传递,hash破解,批量挂马,ddos攻击……
Msf [ metasploit ] 渗透平台,有详细官方文档可参考, www.offensive-security.com
cobalt strike 一款高级蓝队协同作战平台,异常实用,功能强悍,隐蔽性较好...
...

0x05 熟悉几个相对比较主流的渗透系统平台

1
2
3
4
5
Kali			[基于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
12
github.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
关于安全的东西确实非常的多,想一下子全栈掌握暂时似乎还不太现实,但掌握一两个方向至少还是很有可能的
既是如此,投入大量的时间和精力在里面也是肯定的,毕竟都是慢慢积累起来的,安全嘛,说到底就是一个不断学习
不断接触熟悉掌握未知领域的过程,期间肯定会经常去尝试一些自己曾经没做过甚至都没接触过的事情,挑战是经常的
只要不抵触,不浮躁,能静下心耐着性子好好去理解,后面的路就会越来越好走,个人始终坚信 '未知攻焉知防'
一位优秀的防御者,必定也是一位顶尖的入侵者,自己也一直在朝着这方向努力,不管以后是开发各种安全产品也好
写各类渗透工具也好,专门做渗透手也好,或者去研究架构安全也罢,丰富的实战入侵经验在任何时候都是必须的
很明显,只有这样,写出来的工具,才会有更强的针对性和适应性,说了这么多,所谓的'经验'
说白点儿其实都是你自己在实战渗透中解决问题潜移默化形成的那种能力,这也是任何人都给不了你的


安全协议及认证服务脑图

"安全协议和认证服务"


各类漏洞演练平台汇总

"各类漏洞演练平台汇总"