SHOW:
|
|
- or go back to the newest paste.
1 | ############################ | |
2 | # Download the Analysis VM # | |
3 | ############################ | |
4 | - | https://s3.amazonaws.com/infosecaddictsvirtualmachines/InfoSecAddictsVM.zip |
4 | + | https://s3.amazonaws.com/infosecaddictsvirtualmachines/Ubuntu-17-10-InfoSecAddictsVM.zip |
5 | user: infosecaddicts | |
6 | pass: infosecaddicts | |
7 | ||
8 | ||
9 | ||
10 | ||
11 | - | - Log in to your Ubuntu system with the username 'malware' and the password 'malware'. |
11 | + | |
12 | ################################### | |
13 | # Day 1: Intro to Static Analysis # | |
14 | ################################### | |
15 | - | cd Desktop/ |
15 | + | |
16 | - Log in to your Ubuntu system with the username 'infosecaddicts' and the password 'infosecaddicts'. | |
17 | ||
18 | - | - This is actual Malware (remmeber to run it in a VM - the password to extract it is 'infected': |
18 | + | |
19 | - After logging please open a terminal window and type the following commands: | |
20 | ---------------------------Type This----------------------------------- | |
21 | sudo apt-get install -y python-pefile vim | |
22 | - | wget https://s3.amazonaws.com/infosecaddictsfiles/malware-password-is-infected.zip --no-check-certificate |
22 | + | |
23 | ||
24 | ||
25 | wget https://s3.amazonaws.com/infosecaddictsfiles/wannacry.zip --no-check-certificate | |
26 | wget https://s3.amazonaws.com/infosecaddictsfiles/analyse_malware.py --no-check-certificate | |
27 | ||
28 | - | file malware.exe |
28 | + | |
29 | infected | |
30 | - | mv malware.exe malware.pdf |
30 | + | |
31 | file wannacry.exe | |
32 | ||
33 | mv wannacry.exe malware.pdf | |
34 | - | mv malware.pdf malware.exe |
34 | + | |
35 | file malware.pdf | |
36 | - | hexdump -n 2 -C malware.exe |
36 | + | |
37 | mv malware.pdf wannacry.exe | |
38 | ||
39 | hexdump -n 2 -C wannacry.exe | |
40 | ----------------------------------------------------------------------- | |
41 | - | Reference: |
41 | + | |
42 | ||
43 | ||
44 | ***What is '4d 5a' or 'MZ'*** | |
45 | - | objdump -x malware.exe |
45 | + | |
46 | http://www.garykessler.net/library/file_sigs.html | |
47 | - | strings malware.exe |
47 | + | |
48 | ||
49 | - | strings --all malware.exe | head -n 6 |
49 | + | |
50 | ||
51 | - | strings malware.exe | grep -i dll |
51 | + | |
52 | objdump -x wannacry.exe | |
53 | - | strings malware.exe | grep -i library |
53 | + | |
54 | strings wannacry.exe | |
55 | - | strings malware.exe | grep -i reg |
55 | + | |
56 | strings --all wannacry.exe | head -n 6 | |
57 | - | strings malware.exe | grep -i hkey |
57 | + | |
58 | strings wannacry.exe | grep -i dll | |
59 | - | strings malware.exe | grep -i hku |
59 | + | |
60 | strings wannacry.exe | grep -i library | |
61 | - | - We didn't see anything like HKLM, HKCU or other registry type stuff |
61 | + | |
62 | strings wannacry.exe | grep -i reg | |
63 | ||
64 | strings wannacry.exe | grep -i key | |
65 | - | strings malware.exe | grep -i irc |
65 | + | |
66 | strings wannacry.exe | grep -i rsa | |
67 | - | strings malware.exe | grep -i join |
67 | + | |
68 | strings wannacry.exe | grep -i open | |
69 | - | strings malware.exe | grep -i admin |
69 | + | |
70 | strings wannacry.exe | grep -i get | |
71 | - | strings malware.exe | grep -i list |
71 | + | |
72 | strings wannacry.exe | grep -i mutex | |
73 | ||
74 | - | - List of IRC commands: https://en.wikipedia.org/wiki/List_of_Internet_Relay_Chat_commands |
74 | + | |
75 | ||
76 | strings wannacry.exe | grep -i join | |
77 | - | sudo apt-get install -y python-pefile |
77 | + | |
78 | - | malware |
78 | + | |
79 | ||
80 | - | vi analyse_malware.py |
80 | + | |
81 | ----------------------------------------------------------------------- | |
82 | - | python analyse_malware.py malware.exe |
82 | + | |
83 | ||
84 | Hmmmmm.......what's the latest thing in the news - oh yeah "WannaCry" | |
85 | ||
86 | Quick Google search for "wannacry ransomeware analysis" | |
87 | ||
88 | ||
89 | Reference | |
90 | https://securingtomorrow.mcafee.com/executive-perspectives/analysis-wannacry-ransomware-outbreak/ | |
91 | ||
92 | - Yara Rule - | |
93 | ||
94 | ||
95 | Strings: | |
96 | $s1 = “Ooops, your files have been encrypted!” wide ascii nocase | |
97 | $s2 = “Wanna Decryptor” wide ascii nocase | |
98 | $s3 = “.wcry” wide ascii nocase | |
99 | $s4 = “WANNACRY” wide ascii nocase | |
100 | $s5 = “WANACRY!” wide ascii nocase | |
101 | $s7 = “icacls . /grant Everyone:F /T /C /Q” wide ascii nocase | |
102 | - | cd Desktop/ |
102 | + | |
103 | ||
104 | - | wget https://s3.amazonaws.com/infosecaddictsfiles/wannacry.zip |
104 | + | |
105 | Ok, let's look for the individual strings | |
106 | ||
107 | ||
108 | ---------------------------Type This----------------------------------- | |
109 | strings wannacry.exe | grep -i ooops | |
110 | ||
111 | strings wannacry.exe | grep -i wanna | |
112 | ||
113 | strings wannacry.exe | grep -i wcry | |
114 | ||
115 | strings wannacry.exe | grep -i wannacry | |
116 | ||
117 | strings wannacry.exe | grep -i wanacry **** Matches $s5, hmmm..... | |
118 | ----------------------------------------------------------------------- | |
119 | ||
120 | ||
121 | ||
122 | ||
123 | ||
124 | ||
125 | #################################### | |
126 | # Tired of GREP - let's try Python # | |
127 | #################################### | |
128 | Decided to make my own script for this kind of stuff in the future. I | |
129 | ||
130 | Reference1: | |
131 | https://s3.amazonaws.com/infosecaddictsfiles/analyse_malware.py | |
132 | ||
133 | This is a really good script for the basics of static analysis | |
134 | ||
135 | Reference: | |
136 | https://joesecurity.org/reports/report-db349b97c37d22f5ea1d1841e3c89eb4.html | |
137 | ||
138 | ||
139 | This is really good for showing some good signatures to add to the Python script | |
140 | ||
141 | ||
142 | Here is my own script using the signatures (started this yesterday, but still needs work): | |
143 | https://pastebin.com/guxzCBmP | |
144 | ||
145 | ||
146 | ||
147 | ---------------------------Type This----------------------------------- | |
148 | wget https://pastebin.com/raw/guxzCBmP | |
149 | ||
150 | ||
151 | mv guxzCBmP am.py | |
152 | ||
153 | ||
154 | nano am.py | |
155 | ||
156 | python am.py wannacry.exe | |
157 | ----------------------------------------------------------------------- | |
158 | ||
159 | ||
160 | ################################ | |
161 | # Good references for WannaCry # | |
162 | ################################ | |
163 | ||
164 | References: | |
165 | ||
166 | https://gist.github.com/rain-1/989428fa5504f378b993ee6efbc0b168 | |
167 | https://securingtomorrow.mcafee.com/executive-perspectives/analysis-wannacry-ransomware-outbreak/ | |
168 | https://joesecurity.org/reports/report-db349b97c37d22f5ea1d1841e3c89eb4.html | |
169 | ||
170 | ||
171 | ||
172 | ||
173 | ||
174 | ||
175 | Building a Malware Scanner | |
176 | -------------------------- | |
177 | ||
178 | ---------------------------Type This----------------------------------- | |
179 | mkdir ~/Desktop/malwarescanner | |
180 | ||
181 | cd ~/Desktop/malwarescanner | |
182 | ||
183 | wget https://github.com/jonahbaron/malwarescanner/archive/master.zip | |
184 | ||
185 | unzip master.zip | |
186 | ||
187 | cd malwarescanner-master/ | |
188 | ||
189 | python scanner.py -h | |
190 | ||
191 | cat strings.txt | |
192 | ||
193 | cat hashes.txt | |
194 | ||
195 | mkdir ~/Desktop/malcode | |
196 | ||
197 | cp ~/Desktop/malware.exe ~/Desktop/malcode | |
198 | ||
199 | python scanner.py -H hashes.txt -D ~/Desktop/malcode/ strings.txt | |
200 | ||
201 | cd ~/Desktop/ | |
202 | ----------------------------------------------------------------------- | |
203 | ||
204 | ||
205 | ##################################################### | |
206 | # Analyzing Macro Embedded Malware # | |
207 | # Reference: # | |
208 | # https://jon.glass/analyzes-dridex-malware-p1/ # | |
209 | - | ----------------------------------------------------------------------- |
209 | + | |
210 | ---------------------------Type This----------------------------------- | |
211 | cd ~/Desktop/ | |
212 | ||
213 | ||
214 | sudo pip install olefile | |
215 | ||
216 | ||
217 | mkdir ~/Desktop/oledump | |
218 | ||
219 | cd ~/Desktop/oledump | |
220 | ||
221 | wget http://didierstevens.com/files/software/oledump_V0_0_22.zip | |
222 | ||
223 | unzip oledump_V0_0_22.zip | |
224 | ||
225 | wget https://s3.amazonaws.com/infosecaddictsfiles/064016.zip | |
226 | ||
227 | unzip 064016.zip | |
228 | infected | |
229 | ||
230 | python oledump.py 064016.doc | |
231 | ||
232 | python oledump.py 064016.doc -s A4 -v | |
233 | ----------------------------------------------------------------------- | |
234 | ||
235 | ||
236 | ||
237 | - From this we can see this Word doc contains an embedded file called editdata.mso which contains seven data streams. | |
238 | - Three of the data streams are flagged as macros: A3:’VBA/Module1′, A4:’VBA/Module2′, A5:’VBA/ThisDocument’. | |
239 | - | sudo apt install -y python-pefile |
239 | + | |
240 | ---------------------------Type This----------------------------------- | |
241 | python oledump.py 064016.doc -s A5 -v | |
242 | ----------------------------------------------------------------------- | |
243 | ||
244 | - As far as I can tell, VBA/Module2 does absolutely nothing. These are nonsensical functions designed to confuse heuristic scanners. | |
245 | ||
246 | ---------------------------Type This----------------------------------- | |
247 | python oledump.py 064016.doc -s A3 -v | |
248 | ----------------------------------------------------------------------- | |
249 | ||
250 | - | vi am.py |
250 | + | |
251 | - Look for "GVhkjbjv" and you should see: | |
252 | ||
253 | - | ----------------------------------------------------------------------- |
253 | + | |
254 | ||
255 | - Take that long blob that starts with 636D and finishes with 653B and paste it in: | |
256 | http://www.rapidtables.com/convert/number/hex-to-ascii.htm | |
257 | ||
258 | ||
259 | ||
260 | ||
261 | ############## | |
262 | # Yara Ninja # | |
263 | ############## | |
264 | ---------------------------Type This----------------------------------- | |
265 | sudo apt-get remove -y yara | |
266 | ||
267 | ||
268 | wget https://github.com/plusvic/yara/archive/v3.4.0.zip | |
269 | ||
270 | sudo apt-get -y install libtool | |
271 | ||
272 | ||
273 | unzip v3.4.0.zip | |
274 | ||
275 | cd yara-3.4.0 | |
276 | ||
277 | ./bootstrap.sh | |
278 | ||
279 | ./configure | |
280 | ||
281 | make | |
282 | ||
283 | sudo make install | |
284 | ||
285 | ||
286 | yara -v | |
287 | ||
288 | - | ----------------------------------------------------------------------- |
288 | + | |
289 | ||
290 | wget https://github.com/Yara-Rules/rules/archive/master.zip | |
291 | ||
292 | unzip master.zip | |
293 | ||
294 | cd ~/Desktop | |
295 | ||
296 | yara rules-master/packer.yar malcode/malware.exe | |
297 | ----------------------------------------------------------------------- | |
298 | ||
299 | ||
300 | ||
301 | Places to get more Yara rules: | |
302 | ------------------------------ | |
303 | https://malwareconfig.com/static/yaraRules/ | |
304 | https://github.com/kevthehermit/YaraRules | |
305 | https://github.com/VectraThreatLab/reyara | |
306 | ||
307 | ||
308 | ||
309 | Yara rule sorting script: | |
310 | ------------------------- | |
311 | https://github.com/mkayoh/yarasorter | |
312 | ||
313 | ||
314 | ---------------------------Type This----------------------------------- | |
315 | cd ~/Desktop/rules-master | |
316 | for i in $( ls *.yar --hide=master.yar ); do echo include \"$i\";done > master.yar | |
317 | cd ~/Desktop/ | |
318 | yara rules-master/master.yar malcode/malware.exe | |
319 | - | ----------------------------------------------------------------------- |
319 | + | |
320 | ||
321 | ||
322 | ||
323 | ||
324 | ||
325 | ||
326 | ||
327 | ||
328 | ||
329 | Here is a 2 million sample malware DB created by Derek Morton that you can use to start your DB with: | |
330 | http://derekmorton.name/files/malware_12-14-12.sql.bz2 | |
331 | ||
332 | ||
333 | Malware Repositories: | |
334 | --------------------- | |
335 | http://malshare.com/index.php | |
336 | http://www.malwareblacklist.com/ | |
337 | http://www.virusign.com/ | |
338 | http://virusshare.com/ | |
339 | http://www.tekdefense.com/downloads/malware-samples/ | |
340 | ||
341 | ||
342 | ||
343 | ||
344 | ||
345 | ||
346 | ||
347 | ||
348 | ||
349 | ||
350 | ||
351 | ############################### | |
352 | # Creating a Malware Database # | |
353 | ############################### | |
354 | ||
355 | Creating a malware database (sqlite) | |
356 | ---------------------------Type This----------------------------------- | |
357 | sudo apt-get install -y python-simplejson python-simplejson-dbg | |
358 | ||
359 | ||
360 | wget https://s3.amazonaws.com/infosecaddictsfiles/avsubmit.py | |
361 | wget https://s3.amazonaws.com/infosecaddictsfiles/malware-password-is-infected.zip | |
362 | ||
363 | unzip malware-password-is-infected.zip | |
364 | infected | |
365 | ||
366 | python avsubmit.py --init | |
367 | ||
368 | python avsubmit.py -f malware.exe -e | |
369 | ----------------------------------------------------------------------- | |
370 | ||
371 | ||
372 | ||
373 | ||
374 | Creating a malware database (mysql) | |
375 | ----------------------------------- | |
376 | - Step 1: Installing MySQL database | |
377 | - Run the following command in the terminal: | |
378 | ---------------------------Type This----------------------------------- | |
379 | sudo apt-get install mysql-server | |
380 | ----------------------------------------------------------------------- | |
381 | - | ----------------------------------------------------------------------- |
381 | + | |
382 | - Step 2: Installing Python MySQLdb module | |
383 | - Run the following command in the terminal: | |
384 | ---------------------------Type This----------------------------------- | |
385 | sudo apt-get build-dep python-mysqldb | |
386 | ||
387 | ||
388 | sudo apt-get install python-mysqldb | |
389 | ||
390 | ----------------------------------------------------------------------- | |
391 | ||
392 | Step 3: Logging in | |
393 | Run the following command in the terminal: | |
394 | ---------------------------Type This----------------------------------- | |
395 | mysql -u root -p (set a password of 'malware') | |
396 | ----------------------------------------------------------------------- | |
397 | ||
398 | ||
399 | - Then create one database by running following command: | |
400 | ---------------------------Type This----------------------------------- | |
401 | - | ----------------------------------------------------------------------- |
401 | + | |
402 | ||
403 | exit; | |
404 | ||
405 | wget https://raw.githubusercontent.com/dcmorton/MalwareTools/master/mal_to_db.py | |
406 | ||
407 | vi mal_to_db.py (fill in database connection information) | |
408 | ||
409 | python mal_to_db.py -i | |
410 | ----------------------------------------------------------------------- | |
411 | ||
412 | ------- check it to see if the files table was created ------ | |
413 | ||
414 | ---------------------------Type This----------------------------------- | |
415 | mysql -u root -p | |
416 | malware | |
417 | ||
418 | show databases; | |
419 | ||
420 | use malware; | |
421 | ||
422 | show tables; | |
423 | ||
424 | describe files; | |
425 | ||
426 | exit; | |
427 | ----------------------------------------------------------------------- | |
428 | ||
429 | ||
430 | - Now add the malicious file to the DB | |
431 | ---------------------------Type This----------------------------------- | |
432 | python mal_to_db.py -f malware.exe -u | |
433 | ----------------------------------------------------------------------- | |
434 | ||
435 | ||
436 | - Now check to see if it is in the DB | |
437 | ---------------------------Type This----------------------------------- | |
438 | mysql -u root -p | |
439 | malware | |
440 | ||
441 | mysql> use malware; | |
442 | ||
443 | - | ----------------------------------------------------------------------- |
443 | + | |
444 | ||
445 | mysql> quit; | |
446 | ------------------------------------------------------------------------ | |
447 | ||
448 | ||
449 | ||
450 | ||
451 | ||
452 | ||
453 | ||
454 | ||
455 | ||
456 | ||
457 | ################################ | |
458 | # Day 2: Log and PCAP Analysis # | |
459 | ################################ | |
460 | ||
461 | ||
462 | ||
463 | ||
464 | - | ----------------------------------------------------------------------- |
464 | + | ############################################## |
465 | # Log Analysis with Linux command-line tools # | |
466 | ############################################## | |
467 | The following command line executables are found in the Mac as well as most Linux Distributions. | |
468 | ||
469 | cat – prints the content of a file in the terminal window | |
470 | grep – searches and filters based on patterns | |
471 | awk – can sort each row into fields and display only what is needed | |
472 | sed – performs find and replace functions | |
473 | sort – arranges output in an order | |
474 | uniq – compares adjacent lines and can report, filter or provide a count of duplicates | |
475 | ||
476 | ||
477 | ||
478 | ||
479 | ############## | |
480 | # Cisco Logs # | |
481 | ############## | |
482 | - | ----------------------------------------------------------------------- |
482 | + | |
483 | wget https://s3.amazonaws.com/infosecaddictsfiles/cisco.log | |
484 | ----------------------------------------------------------------------- | |
485 | ||
486 | AWK Basics | |
487 | ---------- | |
488 | To quickly demonstrate the print feature in awk, we can instruct it to show only the 5th word of each line. Here we will print $5. Only the last 4 lines are being shown for brevity. | |
489 | ---------------------------Type This----------------------------------- | |
490 | cat cisco.log | awk '{print $5}' | tail -n 4 | |
491 | ----------------------------------------------------------------------- | |
492 | ||
493 | ||
494 | ||
495 | Looking at a large file would still produce a large amount of output. A more useful thing to do might be to output every entry found in “$5”, group them together, count them, then sort them from the greatest to least number of occurrences. This can be done by piping the output through “sort“, using “uniq -c” to count the like entries, then using “sort -rn” to sort it in reverse order. | |
496 | ---------------------------Type This----------------------------------- | |
497 | cat cisco.log | awk '{print $5}'| sort | uniq -c | sort -rn | |
498 | ----------------------------------------------------------------------- | |
499 | - | --------------------------------- |
499 | + | |
500 | ||
501 | ||
502 | While that’s sort of cool, it is obvious that we have some garbage in our output. Evidently we have a few lines that aren’t conforming to the output we expect to see in $5. We can insert grep to filter the file prior to feeding it to awk. This insures that we are at least looking at lines of text that contain “facility-level-mnemonic”. | |
503 | ---------------------------Type This----------------------------------- | |
504 | cat cisco.log | grep %[a-zA-Z]*-[0-9]-[a-zA-Z]* | awk '{print $5}' | sort | uniq -c | sort -rn | |
505 | - | ----------------------------------------------------------------------- |
505 | + | |
506 | ||
507 | ||
508 | ||
509 | ||
510 | Now that the output is cleaned up a bit, it is a good time to investigate some of the entries that appear most often. One way to see all occurrences is to use grep. | |
511 | ---------------------------Type This----------------------------------- | |
512 | cat cisco.log | grep %LINEPROTO-5-UPDOWN: | |
513 | ||
514 | cat cisco.log | grep %LINEPROTO-5-UPDOWN:| awk '{print $10}' | sort | uniq -c | sort -rn | |
515 | ||
516 | cat cisco.log | grep %LINEPROTO-5-UPDOWN:| sed 's/,//g' | awk '{print $10}' | sort | uniq -c | sort -rn | |
517 | ||
518 | cat cisco.log | grep %LINEPROTO-5-UPDOWN:| sed 's/,//g' | awk '{print $10 " changed to " $14}' | sort | uniq -c | sort -rn | |
519 | ----------------------------------------------------------------------- | |
520 | ||
521 | ||
522 | ||
523 | ||
524 | ||
525 | ############### | |
526 | # Apache Logs # | |
527 | ############### | |
528 | ---------------------------Type This----------------------------------- | |
529 | wget https://s3.amazonaws.com/infosecaddictsfiles/access_log | |
530 | ----------------------------------------------------------------------- | |
531 | ||
532 | # top 20 URLs from the last 5000 hits | |
533 | ---------------------------Type This----------------------------------- | |
534 | tail -5000 ./access_log | awk '{print $7}' | sort | uniq -c | sort -rn | head -20 | |
535 | tail -5000 ./access_log | awk '{freq[$7]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20 | |
536 | ----------------------------------------------------------------------- | |
537 | ||
538 | ||
539 | # top 20 URLS excluding POST data from the last 5000 hits | |
540 | - | firefox index.html |
540 | + | |
541 | tail -5000 ./access_log | awk -F"[ ?]" '{print $7}' | sort | uniq -c | sort -rn | head -20 | |
542 | tail -5000 ./access_log | awk -F"[ ?]" '{freq[$7]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20 | |
543 | ----------------------------------------------------------------------- | |
544 | ||
545 | ||
546 | # top 20 IPs from the last 5000 hits | |
547 | ---------------------------Type This----------------------------------- | |
548 | tail -5000 ./access_log | awk '{print $1}' | sort | uniq -c | sort -rn | head -20 | |
549 | tail -5000 ./access_log | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20 | |
550 | ----------------------------------------------------------------------- | |
551 | ||
552 | - | #################### |
552 | + | |
553 | - | # Intro to TCPDump # |
553 | + | |
554 | - | #################### |
554 | + | # top 20 URLs requested from a certain ip from the last 5000 hits |
555 | ---------------------------Type This----------------------------------- | |
556 | - | sudo apt-get install tcpdump |
556 | + | IP=141.101.80.187; tail -5000 ./access_log | grep $IP | awk '{print $7}' | sort | uniq -c | sort -rn | head -20 |
557 | IP=141.101.80.187; tail -5000 ./access_log | awk -v ip=$IP ' $1 ~ ip {freq[$7]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20 | |
558 | ----------------------------------------------------------------------- | |
559 | ||
560 | - | Basic sniffing |
560 | + | |
561 | - | -------------- |
561 | + | |
562 | # top 20 URLS requested from a certain ip excluding, excluding POST data, from the last 5000 hits | |
563 | - | sudo tcpdump -n |
563 | + | |
564 | IP=141.101.80.187; tail -5000 ./access_log | fgrep $IP | awk -F "[ ?]" '{print $7}' | sort | uniq -c | sort -rn | head -20 | |
565 | IP=141.101.80.187; tail -5000 ./access_log | awk -F"[ ?]" -v ip=$IP ' $1 ~ ip {freq[$7]++} END {for (x in freq) {print freq[x], x}}' | sort -rn | head -20 | |
566 | - | Now lets increase the display resolution of this packet, or get more details about it. The verbose switch comes in handy |
566 | + | |
567 | ||
568 | - | sudo tcpdump -v -n |
568 | + | |
569 | ||
570 | # top 20 referrers from the last 5000 hits | |
571 | ---------------------------Type This----------------------------------- | |
572 | - | Getting the ethernet header (link layer headers) |
572 | + | tail -5000 ./access_log | awk '{print $11}' | tr -d '"' | sort | uniq -c | sort -rn | head -20 |
573 | - | ------------------------------------------------ |
573 | + | tail -5000 ./access_log | awk '{freq[$11]++} END {for (x in freq) {print freq[x], x}}' | tr -d '"' | sort -rn | head -20 |
574 | - | In the above examples details of the ethernet header are not printed. Use the -e option to print the ethernet header details as well. |
574 | + | |
575 | ||
576 | - | sudo tcpdump -vv -n -e |
576 | + | |
577 | ||
578 | # top 20 user agents from the last 5000 hits | |
579 | - | Sniffing a particular interface |
579 | + | |
580 | tail -5000 ./access_log | cut -d\ -f12- | sort | uniq -c | sort -rn | head -20 | |
581 | - | In order to sniff a particular network interface we must specify it with the -i switch. First lets get the list of available interfaces using the -D switch. |
581 | + | |
582 | ||
583 | - | sudo tcpdump -D |
583 | + | |
584 | ||
585 | # sum of data (in MB) transferred in the last 5000 hits | |
586 | - | Filtering packets using expressions - Selecting protocols |
586 | + | |
587 | tail -5000 ./access_log | awk '{sum+=$10} END {print sum/1048576}' | |
588 | ----------------------------------------------------------------------- | |
589 | - | $ sudo tcpdump -n tcp |
589 | + | |
590 | ||
591 | ||
592 | - | Particular host or port |
592 | + | |
593 | - | ----------------------- |
593 | + | |
594 | - | Expressions can be used to specify source ip, destination ip, and port numbers. The next example picks up all those packets with source address 192.168.1.101 |
594 | + | |
595 | ################################# | |
596 | - | $ sudo tcpdump -n 'src 192.168.1.101' |
596 | + | # Using Python for log analysis # |
597 | ################################# | |
598 | ---------------------------Type This----------------------------------- | |
599 | - | Next example picks up dns request packets, either those packets which originate from local machine and go to port 53 of some other machine. |
599 | + | wget https://s3.amazonaws.com/infosecaddictsfiles/access_log |
600 | ||
601 | - | $ sudo tcpdump -n 'udp and dst port 53' |
601 | + | |
602 | cat access_log | grep 141.101.80.188 | |
603 | ||
604 | - | To display the FTP packets coming from 192.168.1.100 to 192.168.1.2 |
604 | + | cat access_log | grep 141.101.80.187 |
605 | ||
606 | - | $ sudo tcpdump 'src 192.168.1.100 and dst 192.168.1.2 and port ftp' |
606 | + | cat access_log | grep 108.162.216.204 |
607 | ||
608 | cat access_log | grep 173.245.53.160 | |
609 | - | Search the network traffic using grep |
609 | + | |
610 | cat access_log | grep 173.245.53.160 | wc -l | |
611 | - | Grep can be used along with tcpdump to search the network traffic. Here is a very simple example |
611 | + | |
612 | --------------------------------------------------------- | |
613 | - | $ sudo tcpdump -n -A | grep -e 'POST' |
613 | + | |
614 | ||
615 | Take a look at the following reference: | |
616 | - | So what is the idea behind searching packets. Well one good thing can be to sniff passwords. |
616 | + | http://cmdlinetips.com/2011/08/three-ways-to-read-a-text-file-line-by-line-in-python/ |
617 | - | Here is quick example to sniff passwords using egrep |
617 | + | |
618 | ||
619 | ||
620 | - | tcpdump port http or port ftp or port smtp or port imap or port pop3 -l -A | egrep -i 'pass=|pwd=|log=|login=|user=|username=|pw=|passw=|passwd=|password=|pass:|user:|username:|password:|login:|pass |user ' --color=auto --line-buffered -B20 |
620 | + | Let's have some fun..... |
621 | ---------------------------Type This----------------------------------- | |
622 | python | |
623 | ||
624 | >>> f = open('access_log', "r") | |
625 | - | ######### |
625 | + | |
626 | - | # NGrep # |
626 | + | >>> lines = f.readlines() |
627 | - | ######### |
627 | + | |
628 | >>> print lines | |
629 | - | Install ngrep on Ubuntu |
629 | + | |
630 | >>> lines[0] | |
631 | - | $ sudo apt-get install ngrep |
631 | + | |
632 | >>> lines[10] | |
633 | ||
634 | - | Search network traffic for string "User-Agent: " |
634 | + | >>> lines[50] |
635 | ||
636 | - | $ sudo ngrep -d eth0 "User-Agent: " tcp and port 80 |
636 | + | >>> lines[1000] |
637 | ||
638 | - | In the above command : |
638 | + | >>> lines[5000] |
639 | - | a) tcp and port 80 - is the bpf filter (Berkeley Packet Filter) , that sniffs only TCP packet with port number 80 |
639 | + | |
640 | - | b) The d option specifies the interface to sniff. eth0 in this case. |
640 | + | >>> lines[10000] |
641 | - | c) "User-Agent: " is the string to search for. All packets that have that string are displayed. |
641 | + | |
642 | >>> print len(lines) | |
643 | - | 2. Search network packets for GET or POST requests : |
643 | + | |
644 | >>> exit() | |
645 | - | $ sudo ngrep -l -q -d eth0 "^GET |^POST " tcp and port 80 |
645 | + | |
646 | ||
647 | - | The l option makes the output buffered and the q option is for quiet ( Be quiet; don't output any information other than packet headers and their payloads (if relevant) ). |
647 | + | |
648 | ---------------------------Type This----------------------------------- | |
649 | - | 3. ngrep without any options would simply capture all packets. |
649 | + | nano logread1.py |
650 | ||
651 | - | $ sudo ngrep |
651 | + | |
652 | ||
653 | ----------------------Paste this in the file---------------------------- | |
654 | - | Reference: |
654 | + | ## Open the file with read only permit |
655 | - | https://dl.packetstormsecurity.net/papers/general/ngreptut.txt |
655 | + | f = open('access_log', "r") |
656 | ||
657 | - | $ sudo ngrep -d eth0 -n 3 |
657 | + | ## use readlines to read all lines in the file |
658 | ## The variable "lines" is a list containing all lines | |
659 | - | $ sudo ngrep -d any port 25 |
659 | + | lines = f.readlines() |
660 | ||
661 | print lines | |
662 | - | This will let you monitor all activity crossing source or destination port 25 |
662 | + | |
663 | - | (SMTP). |
663 | + | |
664 | ## close the file after reading the lines. | |
665 | - | $ sudo ngrep -wi -d wlan0 'user|pass' port 6667 |
665 | + | f.close() |
666 | ||
667 | - | $ sudo ngrep -wi -d any 'user|pass' port 21 |
667 | + | |
668 | ||
669 | ||
670 | Google the following: | |
671 | - python difference between readlines and readline | |
672 | - python readlines and readline | |
673 | ||
674 | ||
675 | ||
676 | ||
677 | Can you write an if/then statement that looks for the following IP in the log file? | |
678 | 141.101.81.187 | |
679 | ||
680 | ||
681 | ||
682 | ||
683 | ||
684 | ||
685 | --------------------------------------------------------- | |
686 | Hint 1: Use Python to look for a value in a list | |
687 | ||
688 | Reference: | |
689 | http://www.wellho.net/mouth/1789_Looking-for-a-value-in-a-list-Python.html | |
690 | ||
691 | ||
692 | ||
693 | ||
694 | --------------------------------------------------------- | |
695 | Hint 2: Use Python to prompt for user input | |
696 | ||
697 | Reference: | |
698 | http://www.cyberciti.biz/faq/python-raw_input-examples/ | |
699 | ||
700 | ||
701 | ||
702 | ||
703 | --------------------------------------------------------- | |
704 | Hint 3: Use Python to search for a string in a list | |
705 | ||
706 | Reference: | |
707 | http://stackoverflow.com/questions/4843158/check-if-a-python-list-item-contains-a-string-inside-another-string | |
708 | ||
709 | ||
710 | ||
711 | ||
712 | ||
713 | Here is my solution: | |
714 | ------------------- | |
715 | $ python | |
716 | >>> f = open('access_log', "r") | |
717 | >>> lines = f.readlines() | |
718 | >>> ip = '141.101.81.187' | |
719 | >>> for string in lines: | |
720 | ... if ip in string: | |
721 | ... print(string) | |
722 | ||
723 | >>> | |
724 | >>> exit() | |
725 | ||
726 | ||
727 | ||
728 | ||
729 | ||
730 | Here is one student's solution - can you please explain each line of this code to me? | |
731 | ------------------------------------------------------------------------------------- | |
732 | ||
733 | ||
734 | ---------------------------Type This----------------------------------- | |
735 | nano logread1.py | |
736 | ||
737 | ||
738 | ||
739 | ----------------------Paste this in the file---------------------------- | |
740 | #!/usr/bin/python | |
741 | ||
742 | f = open('access_log') | |
743 | ||
744 | strUsrinput = raw_input("Enter IP Address: ") | |
745 | ||
746 | for line in iter(f): | |
747 | ip = line.split(" - ")[0] | |
748 | if ip == strUsrinput: | |
749 | print line | |
750 | ||
751 | f.close() | |
752 | ----------------------------------------------------------------------- | |
753 | ||
754 | ||
755 | ||
756 | ||
757 | ------------------------------- | |
758 | ||
759 | Working with another student after class we came up with another solution: | |
760 | ||
761 | ---------------------------Type This----------------------------------- | |
762 | nano logread1.py | |
763 | ||
764 | ||
765 | ||
766 | ----------------------Paste this in the file---------------------------- | |
767 | #!/usr/bin/env python | |
768 | ||
769 | ||
770 | # This line opens the log file | |
771 | f=open('access_log',"r") | |
772 | ||
773 | # This line takes each line in the log file and stores it as an element in the list | |
774 | lines = f.readlines() | |
775 | ||
776 | ||
777 | # This lines stores the IP that the user types as a var called userinput | |
778 | userinput = raw_input("Enter the IP you want to search for: ") | |
779 | ||
780 | ||
781 | ||
782 | # This combination for loop and nested if statement looks for the IP in the list called lines and prints the entire line if found. | |
783 | for ip in lines: | |
784 | if ip.find(userinput) != -1: | |
785 | - | # Understanding Snort rules # |
785 | + | print ip |
786 | ------------------------------------------------------------------------ | |
787 | - | Field 1: Action - Snort can process events in 1 of 3 ways (alert, log, drop) |
787 | + | |
788 | ||
789 | - | Field 2: Protocol - Snort understands a few types of traffic (tcp, udp, icmp) |
789 | + | |
790 | ||
791 | - | Field 3: Source IP (can be a variable like $External_Net, or an IP, or a range) |
791 | + | |
792 | ||
793 | - | Field 4: Source Port (can be a variable like $WebServer_Ports, or a port number, or a range of ports) |
793 | + | |
794 | ||
795 | - | Field 5: Traffic Direction (->) |
795 | + | |
796 | ||
797 | - | Field 6: Destination IP (can be a variable like $External_Net, or an IP, or a range) |
797 | + | |
798 | ||
799 | - | Field 7: Destination Port (can be a variable like $WebServer_Ports, or a port number, or a range of ports) |
799 | + | |
800 | ################# | |
801 | - | Field 8: MSG - what is actually displayed on the analysts machine |
801 | + | |
802 | ################# | |
803 | ---------------------------Type This----------------------------------- | |
804 | - | Let's look at 2 simple rules |
804 | + | |
805 | - | ---------------------------------------------------------------------------------- |
805 | + | |
806 | - | alert tcp $EXTERNAL_NET any -> $HOME_NET 135 (msg:”NETBIOS DCERPC ISystemActivator \ |
806 | + | |
807 | - | bind attempt”; flow:to_server,established; content:”|05|”; distance:0; within:1; \ |
807 | + | |
808 | - | content:”|0b|”; distance:1; within:1; byte_test:1,&,1,0,relative; content:”|A0 01 00 \ |
808 | + | |
809 | - | 00 00 00 00 00 C0 00 00 00 00 00 00 46|”; distance:29; within:16; \ |
809 | + | |
810 | - | reference:cve,CAN-2003-0352; classtype:attempted-admin; sid:2192; rev:1;) |
810 | + | |
811 | ||
812 | - | alert tcp $EXTERNAL_NET any -> $HOME_NET 445 (msg:”NETBIOS SMB DCERPC ISystemActivator bind \ |
812 | + | |
813 | - | attempt”; flow:to_server,established; content:”|FF|SMB|25|”; nocase; offset:4; \ |
813 | + | |
814 | - | depth:5; content:”|26 00|”; distance:56; within:2; content:”|5c \ |
814 | + | |
815 | - | 00|P|00|I|00|P|00|E|00 5c 00|”; nocase; distance:5; within:12; content:”|05|”; \ |
815 | + | |
816 | - | distance:0; within:1; content:”|0b|”; distance:1; within:1; \ |
816 | + | |
817 | - | byte_test:1,&,1,0,relative; content:”|A0 01 00 00 00 00 00 00 C0 00 00 00 00 00 00 \ |
817 | + | python -m SimpleHTTPServer |
818 | - | 46|”; distance:29; within:16; reference:cve,CAN-2003-0352; classtype:attempted-admin; \ |
818 | + | |
819 | - | sid:2193; rev:1;) |
819 | + | Now you can just browse to the IP address of your Linux box on port 8000 |
820 | - | ---------------------------------------------------------------------------------- |
820 | + | |
821 | http://Linux-Box-IP:8000/ | |
822 | ||
823 | ||
824 | - | From your Linux machine ping your Windows machine |
824 | + | |
825 | --------------------------Type This----------------------------------- | |
826 | - | ping 192.168.150.1 |
826 | + | |
827 | ||
828 | cat index.text | grep -v '"' | grep -oE "([0-9]+\.){3}[0-9]+.*\)" | awk '{print $4, $5, $6}' | sort | uniq -c | sort -nr | |
829 | ||
830 | - | Start wireshark and let's create some simple filters: |
830 | + | |
831 | for i in session_00[0-9]*.http.html; do srcip=`cat "$i" | grep 'http:\ ' | awk '{print $2}' | cut -d ':' -f1`; dstip=`cat "$i" | grep 'http:\ ' | awk '{print $4}' | cut -d ':' -f1`; host=`cat "$i" | grep 'Host:\ ' | sort -u | sed -e 's/Host:\ //g'`; echo "$srcip --> $dstip = $host"; done | sort -u | |
832 | - | Filter 1: |
832 | + | |
833 | ||
834 | - | ip.addr==192.168.150.1 |
834 | + | |
835 | ||
836 | ||
837 | - | Filter 2: |
837 | + | ######################## |
838 | # Playing with TCPDump # | |
839 | - | ip.addr==192.168.150.1 && icmp |
839 | + | ######################## |
840 | ||
841 | Let's install tcpdump | |
842 | ---------------------------Type This----------------------------------- | |
843 | - | Filter 3: |
843 | + | sudo apt install -y tcpdump |
844 | ------------------------------------------------------------------------ | |
845 | - | ip.addr==192.168.150.1 && !(tcp.port==22) |
845 | + | |
846 | ||
847 | - | Now stop your capture and restart it (make sure you keep the filter) |
847 | + | |
848 | The easiest way to use tcpdump is to just directly write a pcap file | |
849 | Run tcpdump to capture a .pcap file that we will use for the next exercise | |
850 | ||
851 | ---------------------------Type This----------------------------------- | |
852 | - | Back to your Linux machine: |
852 | + | |
853 | - | [ CTRL-C ] - to stop your ping |
853 | + | sudo tcpdump -ni eth0 -s0 -w quick.pcap |
854 | ||
855 | - | wget http://downloads.securityfocus.com/vulnerabilities/exploits/oc192-dcom.c |
855 | + | ---------------------------------------------------------------------- |
856 | ||
857 | --open another command prompt-- | |
858 | - | gcc -o exploit oc192-dcom.c |
858 | + | |
859 | ---------------------------Type This----------------------------------- | |
860 | - | ./exploit |
860 | + | |
861 | ||
862 | wget http://packetlife.net/media/library/12/tcpdump.pdf | |
863 | - | ./exploit -d 192.168.150.1 -t 0 |
863 | + | |
864 | - | ----------------------------------------------------------------------- |
864 | + | ---------------------------------------------------------------------- |
865 | ||
866 | ||
867 | ||
868 | - | Now go back to WireShark and stop the capture. |
868 | + | The basic structure of tcpdump output is: |
869 | ||
870 | [timestamp] [network protocol] [source IP].[source port] > [destination IP].[destination port] | |
871 | ||
872 | ||
873 | - | ################### |
873 | + | |
874 | - | # Memory Analysis # |
874 | + | tcpdump -nn -r suspicious-time.pcap | head |
875 | - | ################### |
875 | + | |
876 | ||
877 | ||
878 | ||
879 | To grab a count of the number of packets in a capture you can type: | |
880 | ---------------------------Type This----------------------------------- | |
881 | tcpdump -nn -r suspicious-time.pcap | wc -l | |
882 | ------------------------------------------------------------------------ | |
883 | ||
884 | ||
885 | ||
886 | To select only the source IP with the port, which is the 3rd column you can type: | |
887 | ---------------------------Type This----------------------------------- | |
888 | tcpdump -nn -r suspicious-time.pcap | cut -f 3 -d " " | head | |
889 | ------------------------------------------------------------------------ | |
890 | ||
891 | ||
892 | ||
893 | To filter for just TCP/IP traffic and exclude layer 2 traffic you can use 'tcp or udp' | |
894 | ---------------------------Type This----------------------------------- | |
895 | tcpdump -nn -r suspicious-time.pcap 'tcp or udp' | cut -f 3 -d " " | head | |
896 | ------------------------------------------------------------------------ | |
897 | ||
898 | ||
899 | ||
900 | Here we are removing the source port by adding another cut that selects the first 4 columns separated by the "." character: | |
901 | ---------------------------Type This----------------------------------- | |
902 | tcpdump -nn -r suspicious-time.pcap 'tcp or udp' | cut -f 3 -d " " | cut -f 1-4 -d "." | head | |
903 | ------------------------------------------------------------------------ | |
904 | ||
905 | ||
906 | ||
907 | Adding sort and uniq cleans up the data a lot more | |
908 | ---------------------------Type This----------------------------------- | |
909 | tcpdump -nn -r suspicious-time.pcap 'tcp or udp' | cut -f 3 -d " " | cut -f 1-4 -d "." | sort | uniq | head | |
910 | ------------------------------------------------------------------------ | |
911 | ||
912 | ||
913 | ||
914 | If you wanted to see the destination instead of the sources you can change the first cut statement: | |
915 | ---------------------------Type This----------------------------------- | |
916 | - | ----------------------------------------------------------------------- |
916 | + | tcpdump -nn -r suspicious-time.pcap 'tcp or udp' | cut -f 5 -d " " | cut -f 1-4 -d "." | sort | uniq | head |
917 | ------------------------------------------------------------------------ | |
918 | ||
919 | ||
920 | ||
921 | Here we can count just how many of these instances occurred | |
922 | ---------------------------Type This----------------------------------- | |
923 | tcpdump -nn -r suspicious-time.pcap 'tcp or udp' | cut -f 5 -d " " | cut -f 1-4 -d "." | sort | uniq -c | sort -nr | head | |
924 | ------------------------------------------------------------------------ | |
925 | ||
926 | ||
927 | ||
928 | To examine destination ports, start by selecting only destination IPs and ports for new TCP sessions using a Tcpdump filter of 'tcp[13]=2' which selects only packets | |
929 | with the SYN flag set. That way you don’t accidentally give undue weight to commonly used ports like 443 and 80, where there may be a large number of packets over very few sessions as in the case of a HTTP or HTTPS download: | |
930 | ---------------------------Type This----------------------------------- | |
931 | tcpdump -nn -r suspicious-time.pcap 'tcp[13]=2' | cut -f 5 -d " " | sort | uniq -c | sort -nr | head | |
932 | ------------------------------------------------------------------------ | |
933 | ||
934 | ||
935 | - | ###################### |
935 | + | |
936 | - | ----------- ############### # Intro to Reversing # ############### ----------- |
936 | + | Now that you've got the top destinations you can use cut to select only the port |
937 | - | ###################### |
937 | + | |
938 | - | Lab walk-through documents are in the zip file along with the executables that need to be reversed: |
938 | + | tcpdump -nn -r suspicious-time.pcap 'tcp[13]=2' | cut -f 5 -d " " | cut -f 5 -d "." | sort | uniq -c | sort -nr | head |
939 | - | https://s3.amazonaws.com/infosecaddictsfiles/Lena151.zip |
939 | + | |
940 | ||
941 | ||
942 | ||
943 | We can do the same with the source IP to see who the top talkers are: | |
944 | ---------------------------Type This----------------------------------- | |
945 | tcpdump -nn -r suspicious-time.pcap 'tcp[13]=2' | cut -f 3 -d " " | cut -f 1-4 -d "." | sort | uniq -c | sort -nr | head | |
946 | ------------------------------------------------------------------------ | |
947 | ||
948 | ||
949 | ||
950 | Many network protocols store their data as plain text in the payload portion of a packet (SMTP, Syslog, POP3, FTP ASCII mode, HTTP, DNS, etc), and Tcpdump candisplay this text by using the WA switch: | |
951 | ---------------------------Type This----------------------------------- | |
952 | tcpdump -Ann -r suspicious-time.pcap 'dst port 25 or dst port 514 or dst port 110 or dst port 21 or dst port 53 or dst port 80' | head -15 | |
953 | ------------------------------------------------------------------------ | |
954 | ||
955 | ||
956 | ||
957 | Looking at DNS traffic | |
958 | ---------------------------Type This----------------------------------- | |
959 | tcpdump -nn -r suspicious-time.pcap 'port 53' | head -5 | |
960 | ------------------------------------------------------------------------ | |
961 | ||
962 | ||
963 | ||
964 | Let's try to exclude some of the common TLDs and see what we come up with: | |
965 | ---------------------------Type This----------------------------------- | |
966 | tcpdump -nn -r suspicious-time.pcap 'port 53' | grep -Ev '(com|net|org|gov|mil|arpa)' | |
967 | ------------------------------------------------------------------------ | |
968 | ||
969 | ||
970 | ||
971 | Let's grab names instead of IP addresses: | |
972 | ---------------------------Type This----------------------------------- | |
973 | tcpdump -nn -r suspicious-time.pcap 'port 53' | grep -Ev '(com|net|org|gov|mil|arpa)' | cut -f 8 -d " " | grep -E '[a-z]' | |
974 | ------------------------------------------------------------------------ | |
975 | ||
976 | ||
977 | ||
978 | ||
979 | Looking at HTTP traffic | |
980 | ---------------------------Type This----------------------------------- | |
981 | tcpdump -Ann -r suspicious-time.pcap 'dst port 80' | head -15 | |
982 | ------------------------------------------------------------------------ | |
983 | ||
984 | ||
985 | ||
986 | Removing GET/HEAD methods | |
987 | ---------------------------Type This----------------------------------- | |
988 | tcpdump -Ann -r suspicious-time.pcap 'dst port 80' | grep 'HTTP' | grep -Ev '(GET|HEAD)' | head | |
989 | ------------------------------------------------------------------------ | |
990 | ||
991 | ||
992 | ||
993 | Checking out the referer field | |
994 | ---------------------------Type This----------------------------------- | |
995 | tcpdump -Ann -r suspicious-time.pcap 'dst port 80' | grep -i 'referer' | head | |
996 | ------------------------------------------------------------------------ | |
997 | ||
998 | ||
999 | ||
1000 | Checking out the user-agent field | |
1001 | ---------------------------Type This----------------------------------- | |
1002 | tcpdump -Ann -r suspicious-time.pcap 'dst port 80' | grep -Ei 'user-agent' | sort | uniq -c | sort -nr | head -15 | |
1003 | ------------------------------------------------------------------------ | |
1004 | ||
1005 | ||
1006 | ||
1007 | ############################# | |
1008 | # PCAP Analysis with tshark # | |
1009 | ############################# | |
1010 | ---------------------------Type This----------------------------------- | |
1011 | sudo tshark -i eth0 -r suspicious-time.pcap -qz io,phs | |
1012 | ||
1013 | ||
1014 | tshark -r suspicious-time.pcap | grep 'NB.*20\>' | sed -e 's/<[^>]*>//g' | awk '{print $3,$4,$9}' | sort -u | |
1015 | ||
1016 | ||
1017 | tshark -r suspicious-time.pcap | grep 'NB.*1e\>' | sed -e 's/<[^>]*>//g' | awk '{print $3,$4,$9}' | sort -u | |
1018 | ||
1019 | ||
1020 | tshark -r suspicious-time.pcap arp | grep has | awk '{print $3," -> ",$9}' | tr -d '?' | |
1021 | ||
1022 | ||
1023 | tshark -r suspicious-time.pcap -Tfields -e "eth.src" | sort | uniq | |
1024 | ||
1025 | ||
1026 | tshark -r suspicious-time.pcap -R "browser.command==1" -Tfields -e "ip.src" -e "browser.server" | uniq | |
1027 | ||
1028 | tshark -r suspicious-time.pcap -Tfields -e "eth.src" | sort |uniq | |
1029 | ||
1030 | tshark -r suspicious-time.pcap -qz ip_hosts,tree | |
1031 | ||
1032 | tshark -r suspicious-time.pcap -R "http.request" -Tfields -e "ip.src" -e "http.user_agent" | uniq | |
1033 | ||
1034 | tshark -r suspicious-time.pcap -R "dns" -T fields -e "ip.src" -e "dns.flags.response" -e "dns.qry.name" | |
1035 | ||
1036 | ||
1037 | whois rapidshare.com.eyu32.ru | |
1038 | ||
1039 | whois sploitme.com.cn | |
1040 | ||
1041 | ||
1042 | tshark -r suspicious-time.pcap -R http.request -T fields -e ip.src -e ip.dst -e http.host -e http.request.uri | awk '{print $1," -> ",$2, "\t: ","http://"$3$4}' | |
1043 | ||
1044 | tshark -r suspicious-time.pcap -R http.request -T fields -e ip.src -e ip.dst -e http.host -e http.request.uri | awk '{print $1," -> ",$2, "\t: ","http://"$3$4}' | grep -v -e '\/image' -e '.css' -e '.ico' -e google -e 'honeynet.org' | |
1045 | ||
1046 | tshark -r suspicious-time.pcap -qz http_req,tree | |
1047 | ||
1048 | tshark -r suspicious-time.pcap -R "data-text-lines contains \"<script\"" -T fields -e frame.number -e ip.src -e ip.dst | |
1049 | ||
1050 | tshark -r suspicious-time.pcap -R http.request -T fields -e ip.src -e ip.dst -e http.host -e http.request.uri | awk '{print $1," -> ",$2, "\t: ","http://"$3$4}' | grep -v -e '\/image' -e '.css' -e '.ico' | grep 10.0.3.15 | sed -e 's/\?[^cse].*/\?\.\.\./g' | |
1051 | ----------------------------------------------------------------------- | |
1052 | ||
1053 | ||
1054 | ###################################### | |
1055 | # PCAP Analysis with forensicPCAP.py # | |
1056 | ###################################### | |
1057 | ---------------------------Type This----------------------------------- | |
1058 | cd ~/Desktop/suspiciouspcap/ | |
1059 | ||
1060 | wget https://raw.githubusercontent.com/madpowah/ForensicPCAP/master/forensicPCAP.py | |
1061 | ||
1062 | sudo pip install cmd2==0.7.9 | |
1063 | ||
1064 | ||
1065 | python forensicPCAP.py suspicious-time.pcap | |
1066 | ------------------------------------------------------------------------ | |
1067 | ||
1068 | ||
1069 | ---------------------------Type This----------------------------------- | |
1070 | ForPCAP >>> help | |
1071 | ------------------------------------------------------------------------ | |
1072 | ||
1073 | Prints stats about PCAP | |
1074 | ---------------------------Type This----------------------------------- | |
1075 | ForPCAP >>> stat | |
1076 | ------------------------------------------------------------------------ | |
1077 | ||
1078 | Prints all DNS requests from the PCAP file. The id before the DNS is the packet's id which can be use with the "show" command. | |
1079 | ---------------------------Type This----------------------------------- | |
1080 | ForPCAP >>> dns | |
1081 | ||
1082 | ForPCAP >>> show | |
1083 | ------------------------------------------------------------------------ | |
1084 | ||
1085 | Prints all destination ports from the PCAP file. The id before the DNS is the packet's id which can be use with the "show" command. | |
1086 | ---------------------------Type This----------------------------------- | |
1087 | ForPCAP >>> dstports | |
1088 | ||
1089 | ForPCAP >>> show | |
1090 | ---------------------------Type This----------------------------------- | |
1091 | ||
1092 | Prints the number of ip source and store them. | |
1093 | ---------------------------Type This----------------------------------- | |
1094 | ForPCAP >>> ipsrc | |
1095 | ||
1096 | ForPCAP >>> show | |
1097 | ------------------------------------------------------------------------ | |
1098 | ||
1099 | Prints the number of web's requests and store them | |
1100 | ForPCAP >>> web | |
1101 | ||
1102 | ForPCAP >>> show | |
1103 | ------------------------------------------------------------------------ | |
1104 | ||
1105 | ||
1106 | Prints the number of mail's requests and store them | |
1107 | ---------------------------Type This----------------------------------- | |
1108 | ForPCAP >>> mail | |
1109 | ||
1110 | ForPCAP >>> show | |
1111 | ------------------------------------------------------------------------ | |
1112 | ||
1113 | ||
1114 | If you really want to look at some more in-depth analysis of this suspicious-time.pcap file you can download the following document: | |
1115 | https://s3.amazonaws.com/infosecaddictsfiles/Forensic+Challenge+2010_-_Challenge_2_-_Solution.doc | |
1116 | ||
1117 | ||
1118 | ||
1119 | ||
1120 | ||
1121 | ||
1122 | ||
1123 | ||
1124 | ################################### | |
1125 | # Day 3: Intro to Memory Analysis # | |
1126 | ################################### | |
1127 | ||
1128 | ---------------------------Type This----------------------------------- | |
1129 | cd ~/Desktop/ | |
1130 | ||
1131 | sudo apt-get install -y foremost tcpxtract | |
1132 | ||
1133 | wget https://s3.amazonaws.com/infosecaddictsfiles/hn_forensics.vmem | |
1134 | ||
1135 | git clone https://github.com/volatilityfoundation/volatility.git | |
1136 | ||
1137 | cd volatility | |
1138 | sudo pip install distorm3 | |
1139 | sudo python setup.py install | |
1140 | python vol.py -h | |
1141 | python vol.py pslist -f ~/Desktop/hn_forensics.vmem | |
1142 | python vol.py connscan -f ~/Desktop/hn_forensics.vmem | |
1143 | mkdir dump/ | |
1144 | mkdir -p output/pdf/ | |
1145 | python vol.py -f ~/Desktop/hn_forensics.vmem memdmp -p 888 -D dump/ | |
1146 | python vol.py -f ~/Desktop/hn_forensics.vmem memdmp -p 1752 -D dump/ | |
1147 | ***Takes a few min*** | |
1148 | strings 1752.dmp | grep "^http://" | sort | uniq | |
1149 | strings 1752.dmp | grep "Ahttps://" | uniq -u | |
1150 | cd .. | |
1151 | foremost -i ~/Desktop/volatility/dump/1752.dmp -t pdf -o output/pdf/ | |
1152 | cd ~/Desktop/volatility/output/pdf/ | |
1153 | cat audit.txt | |
1154 | cd pdf | |
1155 | ls | |
1156 | grep -i javascript *.pdf | |
1157 | ||
1158 | ||
1159 | ||
1160 | cd ~/Desktop/volatility/output/pdf/ | |
1161 | wget http://didierstevens.com/files/software/pdf-parser_V0_6_4.zip | |
1162 | unzip pdf-parser_V0_6_4.zip | |
1163 | python pdf-parser.py -s javascript --raw pdf/00601560.pdf | |
1164 | python pdf-parser.py --object 11 00600328.pdf | |
1165 | python pdf-parser.py --object 1054 --raw --filter 00601560.pdf > malicious.js | |
1166 | ||
1167 | cat malicious.js | |
1168 | ----------------------------------------------------------------------- | |
1169 | ||
1170 | ||
1171 | ||
1172 | ||
1173 | *****Sorry - no time to cover javascript de-obfuscation today***** | |
1174 | ||
1175 | ||
1176 | ||
1177 | ||
1178 | ---------------------------Type This----------------------------------- | |
1179 | cd ~/Desktop/volatility | |
1180 | mkdir files2/ | |
1181 | python vol.py -f ~/Desktop/hn_forensics.vmem dumpfiles -D files2/ | |
1182 | python vol.py hivescan -f ~/Desktop/hn_forensics.vmem | |
1183 | python vol.py printkey -o 0xe1526748 -f ~/Desktop/hn_forensics.vmem Microsoft "Windows NT" CurrentVersion Winlogon | |
1184 | ----------------------------------------------------------------------- |