From 63e94d2da610f2c5fc646f8f06cf7a0da73d3428 Mon Sep 17 00:00:00 2001 From: Dominic Breuker Date: Tue, 13 Feb 2018 22:39:45 +0100 Subject: [PATCH] add a readme and update binaries --- README.md | 63 ++++++++++++++++++++++++++++++++++++++++++ images/example.gif | Bin 0 -> 37379 bytes internal/pspy/pspy.go | 4 +-- 3 files changed, 65 insertions(+), 2 deletions(-) create mode 100644 README.md create mode 100644 images/example.gif diff --git a/README.md b/README.md new file mode 100644 index 0000000..d131574 --- /dev/null +++ b/README.md @@ -0,0 +1,63 @@ +# pspy - monitor Linux processes without root permissions + +pspy is a command line tool allowing you to snoop on Linux processes without being root. +It can help you to find and analyse cron jobs or other background processes that would otherwise be hidden from you (e.g., a cron job in `/var/spool/cron/root`). +pspy works by using inotify to monitor file system events and a simple scan of `/proc` to find processes. +Inotify events are used as a trigger for `/proc` scanning to not miss short-lived processes. + +## Getting started + +Get the tool onto the machine you want to inspect. +You can choose between the 32 and 64 bit version. +It will only work on Linux. +No other OS is supported as the project relies on Linux kernel features. + +You can run `pspy --help` to learn about the flags and their meaning. +The summary is as follows: +- -p: enables printing commmands to stdout (enabled by default) +- -f: enables printing file system events to stdout (disabled by default) +- r: list of directories to watch. pspy will watch all these subdirectories recursively. +- -d: list of directories to watch. pspy will only watch these directories. No watchers are placed on the subdirectories. + +### Examples + +```bash +# print both commands and file system events, but watch only two directories (one recursive, one not) +pspy64 -pf -r /path/to/my/dir -d /path/to/my/other/dir + +# disable printing commands but enable file system events +go run pspy/main.go -p=false -f +``` + +This is an example from the machine Shrek by [Hack The Box](https://www.hackthebox.eu/). +In this CTF challenge, the task is to exploit a hidden cron job that's changing ownership of all files in a folder. +With pspy, the cron job is easy to find and analyse: + +![animated demo gif](images/example.gif) + +## How it works + +Linux comes with tools to monitor processes spawned on the system. +One example I know is called [forkstat](http://smackerelofopinion.blogspot.de/2014/03/forkstat-new-tool-to-trace-process.html). +It received notifications from the kernel on process-related events such as fork and exec. + +Unfortunately, the tool required root priviledges so you cannot use it to right away. +However, nothing stop you in general from snooping on the processes running on the system. +All data is visible as long as the process is running. +The only problem is you have to catch short-lived processes in the very short timeframe in which they are alive. +Scanning the `/proc` directory for new PIDs in an infinite loop allows doing that but consumes a lot of CPU. + +A stealthier way is to use the following trick. +Process tend to access files such as libraries in `/usr`, temporary files in `/tmp`, log files in `/var`, ... +Without root permissions, you can get notifications whenever these files are touched. +The API for this is[inotify](http://man7.org/linux/man-pages/man7/inotify.7.html). +While we cannot monitor processes direclty, we can monitor their interactions with the file system. + +The trick now is to use these file system events as a trigger to scan `/proc`, hoping that we can do it fast enough to catch the process. +This is essentially what pspy does. +Thus, it has a good chance of capturing most processes, but there is no guarantee you won't miss one. +In general, the longer the processes run, the bigger the chance of catching them is. + +Besides using the events, pspy will also scan `/proc` every 100ms, just to be sure. +My initial experiments suggest the CPU usage is quite low for this value. +Making the interval configurable is on the roadmap. diff --git a/images/example.gif b/images/example.gif new file mode 100644 index 0000000000000000000000000000000000000000..51a193401d7d0f6b99bf05845b1e95f96537a70c GIT binary patch literal 37379 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%0D{?+l(>Ka9%&z?g>hh4uE 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�dPK- zg1$2})ImL*zs$)f)v!|{&JKg#6V@5J0h=MWxS=(?2tJuX91X3)l6i1C>V(LGqAI1eXJ9;J$Yc&zwIUEGWa|GfngC>BF>uE|K7nEHbZX(@!1*AfzO!f>x_}60;Vs#%mZyTY>qK0|oJV&ZS-iEO zo$6?L$#47HM_1vO5EO2lZj~83-aqbr(S~EYKg{pVc{tj91UV?y#ZQD(Z;>0?q*_9T zs>BxyvahX(LluOYG+In90T7eld9A_chjFl)J&W%RuVfZI7{79P&jV*>Gt>WSg<04= zf~$5~7bC>&+uOtCd)Q?_Z$<*ch`7Jh-BGOe0#`=$`Qx|4HFWU?WOyKY-+zQsSJntu z?;ARK;HPsGg9A>VzR%?Ka_S1cMa@R4u>xle3jMBf>I;GfyCV<%UkIgk``?CAf5jjv zVR)Yb5{Fw84ukGZh7-1S57CJbUXOEysS7=)@J`x~+3Wv!cE%}oyv9HGe7`A~zk#2H z3W8UXfe{8R@-|$WO{3=nc4kOg1QLb>HSo54pohiBf~Q2Q{16`HKvzG^(rr9OW$V>7RD3j~Wx%U4E2Kp#&?`lDWxjtlddZJ@z@HW^ z_lEc}<<>Mm`T{0*_Gtg?>ns2kB*pBa9m%9#>rBqul4>E@Mg*yOfGTi1WhE~g!8MquO9TLc%!UvIgWnKm34czLQbr`L=@rCae&`F00}cDfIB{q6(r!F zB`MN%-#GCVuP1`9?0IZ&&fQSb9VqX;a5G{1_Q&VJu4L=$Eovus#QqZeDZ%35@`NG4 z5Zb2R8&z?~W8LcU7|kx$8+l+_kp>ic0v~8QWV!uwLWPaux|d8&QuwvulR^2a*S$YB z>_Y?!F6>3*X+A#tYRNuX`j$1)*e~;c9{I3>Y%0q=#9d`J8HEUZ5st8>gYNSBJ3^!tZcM58UUjqVOzhaC)a zmStYv(i6<+aL?oM;nG)n;<2fLnTc*}6HLtf?asS~2LyX%2DVB9d+)#znJWtxI>}}+x^k*s3AoZJ z%@@+z&g99e?C2F}wph&OR)umFo79TMK~q<Lj`+ z%wUK*)Ur?sxI0U6>8zQYK}=3 zEOIF|v7Wmn=;*_PPqs8GUvav-{qU30vOlQjUm CoqHVs literal 0 HcmV?d00001 diff --git a/internal/pspy/pspy.go b/internal/pspy/pspy.go index 07649d3..207b030 100644 --- a/internal/pspy/pspy.go +++ b/internal/pspy/pspy.go @@ -68,10 +68,10 @@ loop: break loop } if err := in.Watch(dir); err != nil { - fmt.Fprintf(os.Stderr, "Can't create watcher: %v", err) + fmt.Fprintf(os.Stderr, "Can't create watcher: %v\n", err) } case err := <-errCh: - fmt.Fprintf(os.Stderr, "Error walking filesystem: %v", err) + fmt.Fprintf(os.Stderr, "Error walking filesystem: %v\n", err) } } }