Tags: tux trivia
Rating: 5.0
Challenge: Win Tux Trivia Show!
Written by: Tux
nc chall2.2019.redpwn.net 6001
When you connect to the server, all it says is:
"Welcome to Tux Trivia Show!!!" and then asks what the capital of a country is.
I wasnt sure how many times it would ask, but after it seemed to be over 500, it was likely to ask 1000 questions.
I wrote two functions to solve this problem.
The first function gets a query (about the capital of a country) and searches google for it.
After querying google, the script scrapes the results for the capital of the country/state, and then returns it.
There were very few edge cases which are also handled in the script!
After setting this up, I set up communications with the server to read the question, query google, and return the capital to the country.
One problem I had was sending requests to google too often (which resulted in a temporary IP ban), so I connected to a VPN and ran the script again
but this time I set up a dictionary which cached all of the queries I already sent, which sped up the script and let me solve the challenge.
eventually I got a response with: "Here is your flag: flag{TUX_tr1v1A_sh0w+m3st3r3d_:D}"
```Python
import time
import socket
import requests as req
from bs4 import BeautifulSoup
def answer_trivia():
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('chall.2019.redpwn.net',6001))
i = 0
#grabs the intro phrase from the server
#and skips it: "Welcome to Tux Trivia Show!!!"
data = sock.recv(30)
cache = {}
while True:
data = sock.recv(1024)
d = data.decode('utf-8').strip()
print(d)
if "flag" in d:
print(d)
elif "Correct" in d:
pass
elif "INCORRECT" in d:
pass
else:
country = d[d.index('of') + 3:d.index('?')]
# I made a cache for the country:capital values bc I was pissing google off with too many queries
if country in cache:
reply = cache[country].encode('utf-8')
print(reply)
sock.send(reply)
this block handles querying normally
else:
reply = get_country_capital(d)
print(reply)
try:
cache[country] = reply
sock.send(reply.encode('utf-8'))
i += 1
except:
print(i)
if (not data):
break
def get_country_capital(query):
#handles all edge cases I seemd to have
if query == "What is the capital of Kazakhstan?":
return "Astana"
if query == "What is the capital of Ukraine?":
return "Kiev"
if query == "What is the capital of Switzerland?":
return "Bern"
if query == "What is the capital of Minnesota?":
return "St. Paul"
if query == "What is the capital of Marshall Islands?":
return "Majuro"
if query == "What is the capital of New York?":
return "Albany"
if query == "What is the capital of Kuwait?":
return "Kuwait City"
r = req.get("https://www.google.com/search?q="+query)
soup = BeautifulSoup(r.text, "html.parser")
divs = soup.find_all("div")
for item in divs:
if(len(item.text) > 30):
continue
else:
if "BNeawe" and "AP7Wnd" in str(item):
if "/" in item.text:
continue
else:
if ("-" and "Wikipedia") in item.text:
return item.text[:item.text.index('-')]
else:
return item.text
answer_trivia()
```