无根嗅闻

2021-06-22 15:54:57

曾几何时,一个菜鸟在服务器上找到了一个RCE,但没有得到root,noob想要嗅探到达那个服务器的请求,以升级权限,但没有知道如何。那个菜鸟是我,这是我的故事。

好的,忽略废话介绍。我可以访问www-data用户,服务器运行nginx + php-fpm,我怎么能嗅到请求而不烙它来运行tcpdump? nginx和php-fpm主进程以root身份运行,但工人在www-data上运行。哦,这是一个码头alpine实例,fack。

想到的第一个想法是通过/ proc / pid / mem来抛弃nginx / php-fpm工作者的记忆,并希望请求在那里。这是一个关于它的漂亮线程Unix.stackexchange.com/questions/6301/how-do-i-read-from-proc-pid-mem-under-linux得到了大部分信息。

我遇到的问题是大多数工具/脚本都使用ptrace syscall在转储之前附加到过程,并且您可以' t ptrace在谷仓上的谷仓上的docker上,没有特定的配置 - add = sys_ptrace或docker-compose.yml:

在4.8之后的Docker运行内核上,您可以使用process_vm_readv syscall转储内存而无需附加到它,但您仍然可以' t转储用户下的任何进程的内存。如果/ proc / sys / kernel / yama / ptrace_scope设置为1,则只允许ptrace / process_vm_readv如果您的powercess是您想要Ptrace的父亲,如果它' s设置为零,您可以转储内存,但它默认在大多数系统上默认为' s 1。 yama On General上更多信息:kernel.org/doc/documentation/security/yama.txt

基本上,我只能转储我在我的用户执行的过程中的内存,而不是我的用户运行的任何进程。工作人员由root下运行的大师进程执行:'(我也可以从www-data删除一个新工人,因为主进程将忽略它。

这里的想法是,对于每个请求,nginx工人将打开该套接字的新文件描述符,如果i' m快速,via / proc / pid / fd / n可以转储他的内容。它'是一个很好的想法,但你可以通过使用文件/ proc / pid / fd / n与套接字/管道交互。

Warning: Can only detect less than 5000 characters

所以我制作了一个自动化这一整个过程的脚本,并确保如果出现任何问题,它将重命名旧套接字后退,以便服务器没有脱机'

/ tmp $ ./dsm .php-fpm.sockUnix域套接字emifferby @caioluders [?]重命名为.php-fpm.sock.1 [?]绑定欺骗套接字.php-fpm.sock [? ]欺骗套接字正在倾听... [?]新连接---------------------------------------------- php-fpm.sock ------------------------------------------ recket_filename / api / public / index.php QUERY_STRINGq = /&安培; REQUEST_METHODGET CONTENT_TYPECONTENT_LENGTHSCRIPT_NAME / index.php的REQUEST_URI / DOCUMENT_URI / index.phpDOCUMENT_ROOT / API / publiSERVER_PROTOCOLHTTP / 1.1REQUEST_SCHEMEhttpGATEWAY_INTERFACECGI / 1.1 SERVER_SOFTWAREnginx / 1.18.0REMOTE_ADDR172.18.0.1 REMOTE_PORT57778SERVER_ADDR172.18.0.2 SERVER_PORT80 SERVER_NAME_REDIRECT_STATUS200 HTTP_HOST127.0.0.1:9022RHTTP_USER_AGENTMozilla / 5.0(Macintosh;英特尔Mac OS X 10.14; RV:85.0)Gecko / 20100101 Firefox / 85.0 jhttp_accepttext / html,application / xhtml + xml,application / xml; q = 0.9,imhttp_accept_encodinggzip,deflatenguagept-br,pt; q = 0.8 ,en-US; q = 0.5,en; q = 0.3http_connectionKeep-Alivehttp_upgrade_inseCure_Requests1 --------------- ---------------------新数据包----------------------- ----------------------------------------php-FPM。袜子1 ------------------------------------主脚本UnknownKStatus:404不是FoundX Powered-by: PHP / 7.4.15 CContent型:TEXT / HTML; charset = UTF-8未找到。[?]新连接

在UNIX内核上,我猜测的是我猜的一个Web家伙,并帮助更好地了解Linux内核上的基本授权流程,真的很有敏感。我的大多数想法都是狗屎,并没有工作,发现我可以欺骗unix域套接字,nginx内部用于我的新技术。如果您在登录POST请求上获取纯文本凭据,则可以在红色组合上使用红色组合以升级权限。您还可以做的不仅仅是嗅探请求:您可以更改服务器'响应!使用你的想象力,也许我以后做一个工具来实现这一点。

我不知道哪个框架使用Unix域套接字以与nginx + php-fpm相同的方式使用,但我想应该存在更多的上下文,如果您发现更多场景,请发布它。