Presentación guía sencilla en Microsoft Excel.pptx
Rooted 2018 - Crawlino: The next level of crawling systems
1. T H E N E X T L E V E L O F T H E
C R A W L I N G S Y S T E M S
C R A W L I N O
2. < / S P A M > M E ( C R 0 H N ) < / S P A M >
• C r e a t o r / c o - c r e a t o r m a n y
s e c u r i t y t o o l s
• S e c u r i t y r e s e a r c h e r / e t h i c a l
h a c k i n g
• C h a p t e r L e a d e r O W A S P M a d r i d
• P y t h o n d e v e l o p e r y t e a c h e r
• W o r k i n g o n B B V A - L a b s
https://www.linkedin.com/in/garciagarciadaniel
@ggdaniel
5. @ggdaniel
¿ Q U É E S U N C R A W L E R ?
"A Web crawler, sometimes called a spider, is an Internet bot that
systematically browses the World Wide Web, typically for the
purpose of Web indexing (web spidering).”
6. @ggdaniel
¿ Q U É E S U N C R A W L E R ?
"A Web crawler, sometimes called a spider, is an Internet bot that
systematically browses the World Wide Web, typically for the
purpose of Web indexing (web spidering).”
9. @ggdaniel
¿ Q U E H A D E N U E V O , V I E J O ?
• Frameworks farragosos
• Necesitas sabre programar (más o menos bien)
• Solo para web
10. @ggdaniel
¿ Q U E H A D E N U E V O , V I E J O ?
• Frameworks farragosos
• Necesitas sabre programar (más o menos bien)
• Solo para web
• Horribles de mantener
22. @ggdaniel
N U E V A S R E G L A S
R E G L A - 1 : P R O G R A M A R D E B E R Í A S E R O P C I O N A L
23. @ggdaniel
R E G L A - 1 : P R O G R A M A R D E B E R Í A S E R O P C I O N A L
N U E V A S R E G L A S
24. @ggdaniel
R E G L A - 1 : P R O G R A M A R D E B E R Í A S E R O P C I O N A L
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
N U E V A S R E G L A S
25. @ggdaniel
R E G L A - 1 : P R O G R A M A R D E B E R Í A S E R O P C I O N A L
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
N U E V A S R E G L A S
26. @ggdaniel
R E G L A - 1 : P R O G R A M A R D E B E R Í A S E R O P C I O N A L
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
R E G L A - 3 : L A M A N T E N I B I L I D A D E S U N A M Á X I M A
N U E V A S R E G L A S
27. @ggdaniel
R E G L A - 1 : P R O G R A M A R D E B E R Í A S E R O P C I O N A L
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
R E G L A - 3 : L A M A N T E N I B I L I D A D E S U N A M Á X I M A
N U E V A S R E G L A S
28. @ggdaniel
R E G L A - 1 : P R O G R A M A R D E B E R Í A S E R O P C I O N A L
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
R E G L A - 3 : L A M A N T E N I B I L I D A D E S U N A M Á X I M A
R E G L A - 4 : N O R E I N V E N T A R L A R U E D A
N U E V A S R E G L A S
29. @ggdaniel
R E G L A - 1 : P R O G R A M A R D E B E R Í A S E R O P C I O N A L
30. @ggdaniel
R E G L A - 1 : P R O G R A M A R D E B E R Í A S E R O P C I O N A L
31. @ggdaniel
R E G L A - 1 : P R O G R A M A R D E B E R Í A S E R O P C I O N A L
32. @ggdaniel
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
33. @ggdaniel
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
34. @ggdaniel
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
Port: 22
35. @ggdaniel
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
Port: 22
Ports: 8000, …
36. @ggdaniel
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
Port: 22
Ports: 8000, …
Port: 5673, …
37. @ggdaniel
R E G L A - 2 : U N C R A W L E R N O S O L O E S W E B
Port: 22
Ports: 8000, …
Port: 5673, …
Ports: ….
38. @ggdaniel
R E G L A - 3 : L A M A N T E N I B I L I D A D E S U N A M Á X I M A
39. @ggdaniel
R E G L A - 3 : L A M A N T E N I B I L I D A D E S U N A M Á X I M A
Legibilidad
40. @ggdaniel
R E G L A - 3 : L A M A N T E N I B I L I D A D E S U N A M Á X I M A
Legibilidad Fácil de aprender
41. @ggdaniel
R E G L A - 3 : L A M A N T E N I B I L I D A D E S U N A M Á X I M A
Legibilidad Fácil de aprender
42. @ggdaniel
R E G L A - 4 : N O R E I N V E N T A R L A R U E D A
43. @ggdaniel
R E G L A - 4 : N O R E I N V E N T A R L A R U E D A
44. @ggdaniel
R E G L A - 4 : N O R E I N V E N T A R L A R U E D A
47. @ggdaniel
¿ Q U É E S C R A W L I N O ?
Un sistema de crawling desarrollado desde cero…
…que cumple las 4 reglas
48. @ggdaniel
¿ Q U É E S C R A W L I N O ?
Un sistema de crawling desarrollado desde cero…
…que cumple las 4 reglas
49. @ggdaniel
E N O T R A S P A L A B R A S …
“Una navaja suiza que nos permite crear herramientas y
automatizaciones usando ficheros de definición de
reglas.”
50. @ggdaniel
E N O T R A S P A L A B R A S …
“Una navaja suiza que nos permite crear herramientas y
automatizaciones usando ficheros de definición de
reglas.”
63. @ggdaniel
I N T E R N A L S - B R I E F
Crawlers Engine
CRAWLINO
64. @ggdaniel
I N T E R N A L S - B R I E F
Crawlers Engine Plugins
CRAWLINO
65. @ggdaniel
R E S U M E N R Á P I D O - E J E M P L O
CRAWLINO
66. @ggdaniel
R E S U M E N R Á P I D O - E J E M P L O
CRAWLINO
67. @ggdaniel
R E S U M E N R Á P I D O - E J E M P L O
CRAWLINO
Dónde
68. @ggdaniel
R E S U M E N R Á P I D O - E J E M P L O
CRAWLINO
Dónde
Cómo
69. @ggdaniel
R E S U M E N R Á P I D O - E J E M P L O
CRAWLINO
Dónde
Cómo
Qué
70. @ggdaniel
C O N C E P T O - S T E P S
CRAWLINO
Dónde
Cómo
Qué
71. @ggdaniel
C O N C E P T O - S T E P S
CRAWLINO
Dónde
Cómo
Qué
De qué manera
Qué retengo
Cómo reacciono
72. @ggdaniel
C O N C E P T O - S T E P S
CRAWLINO
Dónde
Cómo
Qué
De qué manera
Qué retengo
Cómo reacciono
C O N F I GStep 1
73. @ggdaniel
C O N C E P T O - S T E P S
CRAWLINO
Dónde
Cómo
Qué
De qué manera
Qué retengo
Cómo reacciono
C O N F I G
S O U R C E S
Step 1
Step 2
74. @ggdaniel
C O N C E P T O - S T E P S
CRAWLINO
Dónde
Cómo
Qué
De qué manera
Qué retengo
Cómo reacciono
C O N F I G
S O U R C E S
I N P U T
Step 1
Step 2
Step 3
75. @ggdaniel
C O N C E P T O - S T E P S
CRAWLINO
Dónde
Cómo
Qué
De qué manera
Qué retengo
Cómo reacciono
C O N F I G
S O U R C E S
I N P U T
E X T R A C T O R S
Step 1
Step 2
Step 3
Step 4
76. @ggdaniel
C O N C E P T O - S T E P S
CRAWLINO
Dónde
Cómo
Qué
De qué manera
Qué retengo
Cómo reacciono
C O N F I G
S O U R C E S
I N P U T
E X T R A C T O R S
M O D E L
Step 1
Step 2
Step 3
Step 4
Step 5
77. @ggdaniel
C O N C E P T O - S T E P S
CRAWLINO
Dónde
Cómo
Qué
De qué manera
Qué retengo
Cómo reacciono
C O N F I G
S O U R C E S
I N P U T
E X T R A C T O R S
M O D E L
Step 1
Step 2
Step 3
Step 4
Step 5
Step 6 H O O K S
78. @ggdaniel
M O D E L O D E F A S E S
C O N F I G
S O U R C E S
I N P U T
E X T R A C T O R S
M O D E L
Crawling global config actions
Steps
Locations where to get the data
How to get the data
What data want to extract
Action to take after executionH O O K S
How to store data in a database
CRAWLINO
79. @ggdaniel
E J E M P L O - E N U M E R A C I Ó N D E U S U A R I O S
C O N F I G
S O U R C E S
I N P U T
E X T R A C T O R S
M O D E L
-
Steps
http://my_web_site.com/login.php?user=X
web
Regex: finding 200
Notify by eMail
Store results in MongoDB
CRAWLINO
H O O K S
80. @ggdaniel
E J E M P L O - E S C A N E O D E P U E R T O S
C O N F I G
S O U R C E S
I N P U T
E X T R A C T O R S
M O D E L
-
Steps
239.12.1.239
Open Socket
Finding port status ‘open’
Notify by slack
Store results in MongoDB
CRAWLINO
H O O K S
81. @ggdaniel
E J E M P L O - E X P L O T A C I Ó N V U L N E R A B I L I D A D E S
C O N F I G
S O U R C E S
I N P U T
E X T R A C T O R S
M O D E L
-
Steps
www.my_server.com
domain
Get apache specific version
Launch Metasploit
Store results in MongoDB
CRAWLINO
H O O K S
84. @ggdaniel CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
url: /?id=1
001.yaml
D E M O 1 - C R A W L E R S E N C I L L O
85. @ggdaniel CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
url: /?id=1
001.yaml
> crawlino -v rooted/001.yaml
> python dummy_site_ids.py
Server:
Crawlino command:
D E M O 1 - C R A W L E R S E N C I L L O
86. @ggdaniel
I N T R O D U C C I Ó N A L O S G E N E R A D O R E S
CRAWLINO
87. @ggdaniel
I N T R O D U C C I Ó N A L O S G E N E R A D O R E S
• Capaces de generar datos.
• Empotrados en el propio fichero de definición
CRAWLINO
88. @ggdaniel
I N T R O D U C C I Ó N A L O S G E N E R A D O R E S
• Capaces de generar datos.
• Empotrados en el propio fichero de definición
CRAWLINO
• Generadores actuales:
➡ Textos aleatorios
➡ Rangos numéricos
➡ Valores específicos
➡ Wordlists
90. @ggdaniel CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
url: /?id=$generator(numeric, 1, 10)
002.yaml
D E M O 1 - C R A W L E R S E N C I L L O + G E N E R A D O R E S
91. @ggdaniel CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
url: /?id=$generator(numeric, 1, 10)
002.yaml
D E M O 1 - C R A W L E R S E N C I L L O + G E N E R A D O R E S
92. @ggdaniel CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
url: /?id=$generator(numeric, 1, 10)
002.yaml
> crawlino -v rooted/002.yaml
> python dummy_site_ids.py
Server:
Crawlino command:
D E M O 1 - C R A W L E R S E N C I L L O + G E N E R A D O R E S
93. @ggdaniel
D E M O 1 - C R A W L E R E X T E N S O + G E N E R A D O R E S ( I )
CRAWLINO
94. @ggdaniel
D E M O 1 - C R A W L E R E X T E N S O + G E N E R A D O R E S ( I )
CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
timeout: 0.2
httpHeaders:
Host: $generator(random, string, 20, 20)
url: /?id=$generator(numeric, 1, 10)
003.yaml
95. @ggdaniel
D E M O 1 - C R A W L E R E X T E N S O + G E N E R A D O R E S ( I )
CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
timeout: 0.2
httpHeaders:
Host: $generator(random, string, 20, 20)
url: /?id=$generator(numeric, 1, 10)
003.yaml
96. @ggdaniel
D E M O 1 - C R A W L E R E X T E N S O + G E N E R A D O R E S ( I )
CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
timeout: 0.2
httpHeaders:
Host: $generator(random, string, 20, 20)
url: /?id=$generator(numeric, 1, 10)
003.yaml
> crawlino -v rooted/003.yaml
> nc -v -l -k 10000
Server:
Crawlino command:
97. @ggdaniel
D E M O 1 - C R A W L E R E X T E N S O + G E N E R A D O R E S ( I I )
CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
timeout: 0.2
httpHeaders:
Host: $generator(random, string, 20, 20)
url: /?id=$generator(numeric, 1, 10)
003.yaml
> crawlino -w processes -c 10 -v rooted/003.yaml
> nc -v -l -k 10000
Server:
Crawlino command:
98. @ggdaniel
D E M O 1 - C R A W L E R E X T E N S O + G E N E R A D O R E S ( I I )
CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
timeout: 0.2
httpHeaders:
Host: $generator(random, string, 20, 20)
url: /?id=$generator(numeric, 1, 10)
003.yaml
> crawlino -w processes -c 10 -v rooted/003.yaml
> nc -v -l -k 10000
Server:
Crawlino command:
99. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I )
CRAWLINO
100. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I )
CRAWLINO
Supuesto 1
El servicio dummy_site_ids que
devolverá un código 200 un el id
sea 9. En otro caso devolverá un
404
101. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I )
CRAWLINO
Supuesto 1
El servicio dummy_site_ids que
devolverá un código 200 un el id
sea 9. En otro caso devolverá un
404
Paso 1 - Probar en Postman
102. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I )
CRAWLINO
Supuesto 1
El servicio dummy_site_ids que
devolverá un código 200 un el id
sea 9. En otro caso devolverá un
404
103. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I )
CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
url: /?id=$generator(numeric, 1, 20)
extractors:
- ruleSet:
name: rule1
description: check if server returns 200
mapTo: result
inputVar: status_code
rules:
- type: regex
config:
order: 1
expressions:
- 200
Supuesto 1
El servicio dummy_site_ids que
devolverá un código 200 un el id
sea 9. En otro caso devolverá un
404
104. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I )
CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
url: /?id=$generator(numeric, 1, 20)
extractors:
- ruleSet:
name: rule1
description: check if server returns 200
mapTo: result
inputVar: status_code
rules:
- type: regex
config:
order: 1
expressions:
- 200
Supuesto 1
El servicio dummy_site_ids que
devolverá un código 200 un el id
sea 9. En otro caso devolverá un
404
105. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I )
CRAWLINO
name: SimpleWebRequest
description: Do a simple HTTP request
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
url: /?id=$generator(numeric, 1, 20)
extractors:
- ruleSet:
name: rule1
description: check if server returns 200
mapTo: result
inputVar: status_code
rules:
- type: regex
config:
order: 1
expressions:
- 200
> crawlino -v rooted/004.yaml
> python dummy_site_ids.py
Server:
Crawlino command:
Supuesto 1
El servicio dummy_site_ids que
devolverá un código 200 un el id
sea 9. En otro caso devolverá un
404
106. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I )
CRAWLINO
Supuesto 2
Igual que supuesto 1, pero
además, queremos obtener valor
del id que ha devuelto 200
107. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I I )
CRAWLINO
Supuesto 2
Igual que supuesto 1, pero
además, queremos obtener valor
del id que ha devuelto 200
108. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I I )
CRAWLINO
name: SimpleWebRequest
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
url: /?id=$generator(numeric, 1, 20)
extractors:
- ruleSet:
name: rule1
description: check if server returns 200
mapTo: result
report: request.url
inputVar: status_code
rules:
- type: regex
config:
order: 1
expressions:
- 200
Supuesto 2
Igual que supuesto 1, pero
además, queremos obtener valor
del id que ha devuelto 200
109. @ggdaniel
D E M O 2 - C R A W L E R Y F I L T R O S ( I I )
CRAWLINO
name: SimpleWebRequest
sources:
- type: web
config:
url: http: //127.0.0.1:10000
input:
type: web
config:
httpMethod: GET
url: /?id=$generator(numeric, 1, 20)
extractors:
- ruleSet:
name: rule1
description: check if server returns 200
mapTo: result
report: request.url
inputVar: status_code
rules:
- type: regex
config:
order: 1
expressions:
- 200
> crawlino -v rooted/005.yaml
> python dummy_site_ids.py
Server:
Crawlino command:
Supuesto 2
Igual que supuesto 1, pero
además, queremos obtener valor
del id que ha devuelto 200
110. @ggdaniel
D E M O 3 - C R A W L E R Y F I L T R O S ( I I )
CRAWLINO
111. @ggdaniel
D E M O 3 - C R A W L E R Y F I L T R O S ( I I )
CRAWLINO
Supuesto 3
Quiero hacer un bruteforzing de
usuario / contraseña.
El sitio web me devolverá el texto
“Autentication done” si el user /
pass es correcto
112. @ggdaniel
D E M O 3 - C R A W L E R Y F I L T R O S ( I I )
CRAWLINO
Paso 1 - Probar en Postman
Supuesto 3
Quiero hacer un bruteforzing de
usuario / contraseña.
El sitio web me devolverá el texto
“Autentication done” si el user /
pass es correcto
113. @ggdaniel
D E M O 3 - C R A W L E R Y F I L T R O S ( I I )
CRAWLINO
Supuesto 3
Quiero hacer un bruteforzing de
usuario / contraseña.
El sitio web me devolverá el texto
“Autentication done” si el user /
pass es correcto
114. @ggdaniel
D E M O 3 - C R A W L E R Y F I L T R O S ( I I )
CRAWLINO
name: SimpleWebRequest
sources:
- type: web
config:
url: http: //127.0.0.1:11000
input:
type: web
config:
httpMethod: POST
contentType: json
data: '{"user": "admin", "password":
"$generator(wordlist, password-small)"}'
url: /user/auth
extractors:
- ruleSet:
name: rule1
description: check if server returns 200
mapTo: myVar
inputVar: content
report: request.data
rules:
- type: regex
config:
order: 1
expressions:
- Authentication done
Supuesto 3
Quiero hacer un bruteforzing de
usuario / contraseña.
El sitio web me devolverá el texto
“Autentication done” si el user /
pass es correcto
115. @ggdaniel
D E M O 3 - C R A W L E R Y F I L T R O S ( I I )
CRAWLINO
name: SimpleWebRequest
sources:
- type: web
config:
url: http: //127.0.0.1:11000
input:
type: web
config:
httpMethod: POST
contentType: json
data: '{"user": "admin", "password":
"$generator(wordlist, password-small)"}'
url: /user/auth
extractors:
- ruleSet:
name: rule1
description: check if server returns 200
mapTo: myVar
inputVar: content
report: request.data
rules:
- type: regex
config:
order: 1
expressions:
- Authentication done
> crawlino -v rooted/006.yaml
> python dummy_site_user_auth.py
Server:
Crawlino command:
Supuesto 3
Quiero hacer un bruteforzing de
usuario / contraseña.
El sitio web me devolverá el texto
“Autentication done” si el user /
pass es correcto
116. @ggdaniel
D E M O 4 - C R A W L E R Y O T R O S P R O T O C O L O S ( I )
CRAWLINO
117. @ggdaniel
D E M O 4 - C R A W L E R Y O T R O S P R O T O C O L O S ( I )
CRAWLINO
Supuesto 4
Quiero hacer un escaneo de
puertos de un Host
118. @ggdaniel
D E M O 4 - C R A W L E R Y O T R O S P R O T O C O L O S ( I )
CRAWLINO
Supuesto 4
Quiero hacer un escaneo de
puertos de un Host
119. @ggdaniel
D E M O 4 - C R A W L E R Y O T R O S P R O T O C O L O S ( I )
CRAWLINO
name: BasicScrappingCrawler
sources:
- type: domain
config:
domain: 127.0.0.1
input:
type: raw_socket
config:
port: $generator(numeric, 9999, 10010)
proto: tcp
timeout: 0.05
extractors:
- ruleSet:
name: rule1
description: detect an open port
mapTo: myVar
report: original
inputVar: status
rules:
- type: regex
config:
expressions:
- open
Supuesto 4
Quiero hacer un escaneo de
puertos de un Host
120. @ggdaniel
D E M O 4 - C R A W L E R Y O T R O S P R O T O C O L O S ( I )
CRAWLINO
name: BasicScrappingCrawler
sources:
- type: domain
config:
domain: 127.0.0.1
input:
type: raw_socket
config:
port: $generator(numeric, 9999, 10010)
proto: tcp
timeout: 0.05
extractors:
- ruleSet:
name: rule1
description: detect an open port
mapTo: myVar
report: original
inputVar: status
rules:
- type: regex
config:
expressions:
- open
> crawlino -v rooted/007.yaml
> python dummy_site_ids.py
Server:
Crawlino command:
Supuesto 4
Quiero hacer un escaneo de
puertos de un Host
121. @ggdaniel
D E M O 5 - C R A W L E R Y O T R O S P R O T O C O L O S ( I I )
CRAWLINO
122. @ggdaniel
D E M O 5 - C R A W L E R Y O T R O S P R O T O C O L O S ( I I )
CRAWLINO
Supuesto 5
Detectar puerto del servidor
Redis abierto y comprobar si se
ha ejecutado un comando
123. @ggdaniel
D E M O 5 - C R A W L E R Y O T R O S P R O T O C O L O S ( I I )
CRAWLINO
Supuesto 5
Detectar puerto del servidor
Redis abierto y comprobar si se
ha ejecutado un comando
124. @ggdaniel
D E M O 5 - C R A W L E R Y O T R O S P R O T O C O L O S ( I I )
CRAWLINO
name: RedisBasicScan
sources:
- type: domain
config:
domain: 127.0.0.1
input:
type: raw_socket
config:
port: $generator(numeric, 6378, 6380)
proto: tcp
timeout: 0.05
data: "$4rnINFOrn"
extractors:
- ruleSet:
name: rule1
description: detect an open port
mapTo: redisVersion
report: group
inputVar: data
rules:
- type: regex
config:
reportGroup: 2
expressions:
- (redis_version:)([d.]+)(r)
Supuesto 5
Detectar puerto del servidor
Redis abierto y comprobar si se
ha ejecutado un comando
125. @ggdaniel
D E M O 5 - C R A W L E R Y O T R O S P R O T O C O L O S ( I I )
CRAWLINO
name: RedisBasicScan
sources:
- type: domain
config:
domain: 127.0.0.1
input:
type: raw_socket
config:
port: $generator(numeric, 6378, 6380)
proto: tcp
timeout: 0.05
data: "$4rnINFOrn"
extractors:
- ruleSet:
name: rule1
description: detect an open port
mapTo: redisVersion
report: group
inputVar: data
rules:
- type: regex
config:
reportGroup: 2
expressions:
- (redis_version:)([d.]+)(r)
> crawlino -v rooted/008.yaml
> docker run -d -p 6379:6379 redis
Server:
Crawlino command:
Supuesto 5
Detectar puerto del servidor
Redis abierto y comprobar si se
ha ejecutado un comando
126. @ggdaniel
D E M O 5 - C R A W L E R Y O T R O S P R O T O C O L S ( I I )
CRAWLINO
127. @ggdaniel
D E M O 5 - C R A W L E R Y O T R O S P R O T O C O L S ( I I )
CRAWLINO
Supuesto 6
Queremos detectar redis
abiertos en un rango de red
128. @ggdaniel
D E M O 5 - C R A W L E R Y O T R O S P R O T O C O L S ( I I )
CRAWLINO
Supuesto 6
Queremos detectar redis
abiertos en un rango de red
129. @ggdaniel
D E M O 5 - C R A W L E R Y O T R O S P R O T O C O L S ( I I )
CRAWLINO
name: RedisBasicScan
sources:
- type: ip
config:
ip: 127.0.0.$generator(numeric, 1, 4)
input:
type: raw_socket
config:
port: 6379
proto: tcp
timeout: 0.05
data: "$4rnINFOrn"
extractors:
- ruleSet:
name: rule1
description: detect an open port
mapTo: redisVersion
report: host
inputVar: data
rules:
- type: regex
config:
reportGroup: 2
expressions:
- (redis_version:)([d.]+)(r)
Supuesto 6
Queremos detectar redis
abiertos en un rango de red
130. @ggdaniel
D E M O 5 - C R A W L E R Y O T R O S P R O T O C O L S ( I I )
CRAWLINO
name: RedisBasicScan
sources:
- type: ip
config:
ip: 127.0.0.$generator(numeric, 1, 4)
input:
type: raw_socket
config:
port: 6379
proto: tcp
timeout: 0.05
data: "$4rnINFOrn"
extractors:
- ruleSet:
name: rule1
description: detect an open port
mapTo: redisVersion
report: host
inputVar: data
rules:
- type: regex
config:
reportGroup: 2
expressions:
- (redis_version:)([d.]+)(r)
> crawlino -v rooted/009.yaml
> docker run -d -p 6379:6379 redis
Server:
Crawlino command:
Supuesto 6
Queremos detectar redis
abiertos en un rango de red
132. @ggdaniel
V A R I A B L E S
• Crawlino es capaz de resolver variables de entorno en el fichero
de configuración
CRAWLINO
133. @ggdaniel
V A R I A B L E S
• Crawlino es capaz de resolver variables de entorno en el fichero
de configuración
CRAWLINO
• La variables pueden ser pasadas por el propio sistema operativo
o a través de Crawlino
134. @ggdaniel
V A R I A B L E S
• Crawlino es capaz de resolver variables de entorno en el fichero
de configuración
CRAWLINO
• La variables pueden ser pasadas por el propio sistema operativo
o a través de Crawlino
136. @ggdaniel
D E M O 6 - H O O K S
CRAWLINO
Supuesto 7
Queremos enviar un mail que
nos notifique Redis abiertos en
nuestra red
137. @ggdaniel
D E M O 6 - H O O K S
CRAWLINO
010.yaml
Supuesto 7
Queremos enviar un mail que
nos notifique Redis abiertos en
nuestra red
138. @ggdaniel
D E M O 6 - H O O K S
CRAWLINO
name: RedisBasicScan
…
extractors:
- ruleSet:
name: rule1
mapTo: redisVersion
report: host
inputVar: data
rules:
- type: regex
config:
reportGroup: 2
expressions:
- (redis_version:)([d.]+)(r)
hooks:
- type: mail
config:
from: $FROM_MAIL$
to: $TO_MAIL$
subject: Host with Redis open!
bodyField: redisVersion
server:
user: $FROM_MAIL$
smtp: smtp.gmail.com
password: $MAIL_PASSWORD$
010.yaml
Supuesto 7
Queremos enviar un mail que
nos notifique Redis abiertos en
nuestra red
139. @ggdaniel
D E M O 6 - H O O K S
CRAWLINO
name: RedisBasicScan
…
extractors:
- ruleSet:
name: rule1
mapTo: redisVersion
report: host
inputVar: data
rules:
- type: regex
config:
reportGroup: 2
expressions:
- (redis_version:)([d.]+)(r)
hooks:
- type: mail
config:
from: $FROM_MAIL$
to: $TO_MAIL$
subject: Host with Redis open!
bodyField: redisVersion
server:
user: $FROM_MAIL$
smtp: smtp.gmail.com
password: $MAIL_PASSWORD$
010.yaml
> docker run -d -p 6379:6379 redis
Server:
Crawlino command:
> crawlino -e FROM_MAIL=cr0hn@cr0hn.com
-e TO_MAIL=daniel@abirtone.com
-E .env -v rooted/010.yaml
Supuesto 7
Queremos enviar un mail que
nos notifique Redis abiertos en
nuestra red
140. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N
CRAWLINO
141. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N
CRAWLINO
Supuesto 8
Quiero reutilizar definiciones de
crawlers anteriores. Completas
o parciales
142. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : C O M P L E T O
CRAWLINO
143. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : C O M P L E T O
CRAWLINO
name: BaseWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: $TARGER$:10000
input:
type: web
config:
httpMethod: GET
timeout: 0.2
httpHeaders:
Host: $generator(random, string, 20, 20)
url: /?id=$generator(numeric, 1, 10)
base-crawler.yaml
144. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : C O M P L E T O
CRAWLINO
name: BaseWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: $TARGER$:10000
input:
type: web
config:
httpMethod: GET
timeout: 0.2
httpHeaders:
Host: $generator(random, string, 20, 20)
url: /?id=$generator(numeric, 1, 10)
base-crawler.yaml
145. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : C O M P L E T O
CRAWLINO
name: BaseWebRequest
description: Do a simple HTTP request
tags:
- general
- basic
sources:
- type: web
config:
url: $TARGER$:10000
input:
type: web
config:
httpMethod: GET
timeout: 0.2
httpHeaders:
Host: $generator(random, string, 20, 20)
url: /?id=$generator(numeric, 1, 10)
base-crawler.yaml
name: MyCustomCrawler
description: My custom crawler
tags:
- custom
extends: base-crawler.yaml
input:
config:
httpHeaders:
Content-Type: application/x- www-form-
urlencoded
my-crawler.yaml
146. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : P A R T I A L S
CRAWLINO
147. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : P A R T I A L S
CRAWLINO
- type: web
config:
url: $TARGER$:10000
partial-port-1000.yaml
148. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : P A R T I A L S
CRAWLINO
- type: web
config:
url: $TARGER$:10000
partial-port-1000.yaml
- type: mail
config:
from: $FROM_MAIL$
to: $TO_MAIL$
subject: Host with Redis open!
bodyField: redisVersion
server:
user: $FROM_MAIL$
smtp: smtp.gmail.com
password: $MAIL_PASSWORD$
partial-mail.yaml
149. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : P A R T I A L S
CRAWLINO
- type: web
config:
url: $TARGER$:10000
partial-port-1000.yaml
name: MyCustomPartialCrawler
sources:
- type: $import(partial-port-1000)
input:
type: raw_socket
config:
port: 6379
proto: tcp
timeout: 0.05
data: "$4rnINFOrn"
hooks:
- type: $import(partial-mail)
my-partial-crawler.yaml
- type: mail
config:
from: $FROM_MAIL$
to: $TO_MAIL$
subject: Host with Redis open!
bodyField: redisVersion
server:
user: $FROM_MAIL$
smtp: smtp.gmail.com
password: $MAIL_PASSWORD$
partial-mail.yaml
150. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : C A T Á L O G O
CRAWLINO
151. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : C A T Á L O G O
CRAWLINO
Búsqueda de crawlers completos
> crawlino-search crawler redis-scanner
152. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : C A T Á L O G O
CRAWLINO
Búsqueda de crawlers completos
> crawlino-search crawler redis-scanner
Búsqueda de partials
> crawlino-search partial slack
153. @ggdaniel
E J E M P L O 7 - R E U T I L I Z A C I Ó N : : C A T Á L O G O
CRAWLINO
Búsqueda de crawlers completos
> crawlino-search crawler redis-scanner
Búsqueda de partials
> crawlino-search partial slack
Búsqueda de plugins
> crawlino-search plugins metasploit
156. @ggdaniel CRAWLINO
P R Ó X I M A S V E R S I O N S
• Crear más plugins, generadores, hooks…
157. @ggdaniel CRAWLINO
P R Ó X I M A S V E R S I O N S
• Crear más plugins, generadores, hooks…
• Trabajo en modo distribuido y multi-máquina
158. @ggdaniel CRAWLINO
P R Ó X I M A S V E R S I O N S
• Crear más plugins, generadores, hooks…
• Trabajo en modo distribuido y multi-máquina
• Modo servidor con API
159. @ggdaniel CRAWLINO
P R Ó X I M A S V E R S I O N S
• Crear más plugins, generadores, hooks…
• Trabajo en modo distribuido y multi-máquina
• Modo servidor con API
• Interceptar Hooks de Github / Bitbucket cuando se produce un
PUSH
160. @ggdaniel CRAWLINO
P R Ó X I M A S V E R S I O N S
• Crear más plugins, generadores, hooks…
• Trabajo en modo distribuido y multi-máquina
• Modo servidor con API
• Interceptar Hooks de Github / Bitbucket cuando se produce un
PUSH
• Repositorio centralizador de Plugins y Crawlers de ejemplo
161. @ggdaniel CRAWLINO
P R Ó X I M A S V E R S I O N S
• Crear más plugins, generadores, hooks…
• Trabajo en modo distribuido y multi-máquina
• Modo servidor con API
• Interceptar Hooks de Github / Bitbucket cuando se produce un
PUSH
• Repositorio centralizador de Plugins y Crawlers de ejemplo
Beta
Beta
Beta
164. @ggdaniel CRAWLINO
C O N C L U S I O N E S
• La cosas, si no nos hacen pensar más de lo necesario, mejor.
165. @ggdaniel CRAWLINO
C O N C L U S I O N E S
• La cosas, si no nos hacen pensar más de lo necesario, mejor.
• NO está todo inventado
166. @ggdaniel CRAWLINO
C O N C L U S I O N E S
• La cosas, si no nos hacen pensar más de lo necesario, mejor.
• NO está todo inventado
• Cuando enviéis una charla a un conferencia… tened el proyecto
algo avanzado :)
167. @ggdaniel CRAWLINO
C O N C L U S I O N E S
• La cosas, si no nos hacen pensar más de lo necesario, mejor.
• NO está todo inventado
• Y, respecto a crawlino…
• Cuando enviéis una charla a un conferencia… tened el proyecto
algo avanzado :)
168. @ggdaniel CRAWLINO
C O N C L U S I O N E S
• La cosas, si no nos hacen pensar más de lo necesario, mejor.
• NO está todo inventado
• Y, respecto a crawlino…
• Cuando enviéis una charla a un conferencia… tened el proyecto
algo avanzado :)