Initial commit
This commit is contained in:
@@ -0,0 +1 @@
|
||||
.env
|
||||
@@ -0,0 +1,24 @@
|
||||
FROM public.ecr.aws/docker/library/ruby:2.7.2
|
||||
|
||||
ARG PASSWORD
|
||||
|
||||
RUN echo root:${PASSWORD} | chpasswd
|
||||
RUN apt-get update && apt-get install -y openssh-server curl
|
||||
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
|
||||
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
|
||||
RUN service ssh start
|
||||
|
||||
WORKDIR /ctf/art/
|
||||
|
||||
RUN useradd -m ctf
|
||||
RUN chown -R root:root /ctf/art/
|
||||
|
||||
COPY Gemfile .
|
||||
COPY app.rb .
|
||||
COPY start.sh .
|
||||
|
||||
RUN bundle install
|
||||
RUN touch /flag.txt
|
||||
|
||||
RUN chmod +x start.sh
|
||||
CMD ./start.sh
|
||||
@@ -0,0 +1,4 @@
|
||||
source "http://rubygems.org"
|
||||
|
||||
gem "sinatra"
|
||||
gem "slim"
|
||||
@@ -0,0 +1,14 @@
|
||||
require "sinatra"
|
||||
require "slim"
|
||||
|
||||
set :port, 8080
|
||||
set :bind, '0.0.0.0'
|
||||
set :environment, :production
|
||||
|
||||
get '/' do
|
||||
redirect '/art/gemastik'
|
||||
end
|
||||
|
||||
get '/art/:word' do
|
||||
return Slim::Template.new{ '<iframe height="100%" width="100%" frameborder="0" src=https://asciified.thelicato.io/api/v2/ascii?text=' + params[:word] + '></iframe>' }.render
|
||||
end
|
||||
@@ -0,0 +1,11 @@
|
||||
version: '3'
|
||||
services:
|
||||
art:
|
||||
restart: always
|
||||
build:
|
||||
context: .
|
||||
args:
|
||||
- PASSWORD=root
|
||||
ports:
|
||||
- "10000:8080"
|
||||
- "10022:22"
|
||||
@@ -0,0 +1,5 @@
|
||||
# run sshd
|
||||
/usr/sbin/sshd -D &
|
||||
# run the command
|
||||
su ctf -c "bundle install"
|
||||
su ctf -c "ruby /ctf/art/app.rb"
|
||||
@@ -0,0 +1,29 @@
|
||||
FROM public.ecr.aws/docker/library/ubuntu:20.04
|
||||
|
||||
ARG PASSWORD
|
||||
|
||||
ENV DEBIAN_FRONTEND noninteractive
|
||||
|
||||
RUN echo root:${PASSWORD} | chpasswd
|
||||
RUN apt-get update && apt-get install -y openssh-server lib32z1 xinetd cmake gcc curl
|
||||
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
|
||||
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
|
||||
RUN service ssh start
|
||||
|
||||
RUN useradd -m ctf
|
||||
|
||||
WORKDIR /ctf
|
||||
|
||||
RUN echo "Connection blocked" > /etc/banner_fail
|
||||
COPY ctf.xinetd /etc/xinetd.d/ctf
|
||||
COPY ./src/main.c ./
|
||||
COPY ./start.sh ./
|
||||
RUN gcc /ctf/main.c -no-pie -fno-stack-protector -Wl,-z,relro,-z,now -o /ctf/main
|
||||
RUN touch /flag.txt
|
||||
RUN chmod -R 755 /ctf
|
||||
RUN chmod +x /ctf/start.sh
|
||||
|
||||
ENTRYPOINT []
|
||||
CMD ["/usr/sbin/xinetd", "-dontfork"]
|
||||
|
||||
EXPOSE 8000
|
||||
@@ -0,0 +1,18 @@
|
||||
service ctf
|
||||
{
|
||||
disable = no
|
||||
socket_type = stream
|
||||
protocol = tcp
|
||||
wait = no
|
||||
user = root
|
||||
type = UNLISTED
|
||||
port = 8000
|
||||
bind = 0.0.0.0
|
||||
server = /bin/sh
|
||||
server_args = /ctf/start.sh
|
||||
banner_fail = /etc/banner_fail
|
||||
# safety options
|
||||
per_source = 10 # the maximum instances of this service per source IP address
|
||||
rlimit_cpu = 1 # the maximum number of CPU seconds that the service may use
|
||||
#rlimit_as = 1024M # the Address Space resource limit for the service
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
void give_me_idea() {
|
||||
char buf[64];
|
||||
puts("Do you have a good idea?");
|
||||
fgets(buf, 200, stdin);
|
||||
}
|
||||
|
||||
void main() {
|
||||
setbuf(stdout, NULL);
|
||||
give_me_idea();
|
||||
puts("hmm... I'm also think the same thing...");
|
||||
return 0;
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
/usr/sbin/sshd -D &
|
||||
su ctf -c "/ctf/main"
|
||||
@@ -0,0 +1,27 @@
|
||||
FROM public.ecr.aws/docker/library/python:3.11-slim-buster
|
||||
|
||||
ARG PASSWORD
|
||||
|
||||
WORKDIR /opt
|
||||
|
||||
RUN apt-get update
|
||||
RUN apt-get install -y nano openssh-server \
|
||||
gcc python-dev python3-dev libgmp3-dev curl
|
||||
|
||||
RUN echo root:${PASSWORD} | chpasswd
|
||||
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
|
||||
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
|
||||
RUN service ssh start
|
||||
|
||||
COPY src/ .
|
||||
RUN touch /flag.txt
|
||||
RUN touch /priv.data
|
||||
|
||||
RUN pip install -r requirements.txt
|
||||
RUN python3 database/init.py merricx_number_1_fans ${PASSWORD}
|
||||
RUN chmod +x ./start.sh
|
||||
|
||||
EXPOSE 80
|
||||
EXPOSE 22
|
||||
|
||||
CMD ./start.sh
|
||||
@@ -0,0 +1,16 @@
|
||||
version: "3"
|
||||
|
||||
services:
|
||||
burvesigner:
|
||||
restart: always
|
||||
container_name: burvesigner
|
||||
build:
|
||||
context: ./
|
||||
args:
|
||||
- PASSWORD=PASSWORD_14000
|
||||
ports:
|
||||
- "14000:80"
|
||||
- "14022:22"
|
||||
volumes:
|
||||
- ./flag.txt:/flag.txt:ro
|
||||
- ./priv.data:/priv.data:ro
|
||||
@@ -0,0 +1 @@
|
||||
PLACEHOLDER
|
||||
@@ -0,0 +1 @@
|
||||
PLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDERPLACEHOLDER
|
||||
@@ -0,0 +1,68 @@
|
||||
#!/usr/bin/env python3
|
||||
from Crypto.Util.number import *
|
||||
from fastecdsa.curve import Curve
|
||||
from fastecdsa.point import Point
|
||||
from base64 import urlsafe_b64decode, urlsafe_b64encode
|
||||
from time import time
|
||||
from zlib import crc32
|
||||
|
||||
|
||||
class BurveSigner:
|
||||
def __init__(self):
|
||||
self.C = Curve(
|
||||
"burvesigner",
|
||||
0xDB7C2ABF62E35E668076BEAD208B,
|
||||
0xDB7C2ABF62E35E668076BEAD2088,
|
||||
0x659EF8BA043916EEDE8911702B22,
|
||||
0xDB7C2ABF62E35E7628DFAC6561C5,
|
||||
0x0E27CD305696E88F38F7EB1FBECE,
|
||||
0xCAA9A6F90944FAD41FBE02B8FD77,
|
||||
)
|
||||
self.t = self.C.p.bit_length() // 8
|
||||
self.u = self.C.p.bit_length() - 64
|
||||
self.v = getRandomNBitInteger(self.u)
|
||||
|
||||
def from_bytes(self, data):
|
||||
return int.from_bytes(data, "little")
|
||||
|
||||
def to_bytes(self, num):
|
||||
return int.to_bytes(num, self.t, "little")
|
||||
|
||||
def hash(self, msg):
|
||||
return crc32(msg)
|
||||
|
||||
def set_keys(self):
|
||||
priv = open("/priv.data", "rb").read()[:self.t]
|
||||
self.x = self.from_bytes(priv)
|
||||
self.Y = self.x * self.C.G
|
||||
|
||||
def get_params(self):
|
||||
self.set_keys()
|
||||
return {
|
||||
"p": self.C.p,
|
||||
"a": self.C.a,
|
||||
"b": self.C.b,
|
||||
"n": self.C.q,
|
||||
"G": (self.C.gx, self.C.gy),
|
||||
"Y": (self.Y.x, self.Y.y),
|
||||
}
|
||||
|
||||
def sign(self, msg):
|
||||
self.set_keys()
|
||||
k = (int(time() * 1337) << self.u) + self.v
|
||||
R = k * self.C.G
|
||||
s = (self.hash(msg) - self.x * R.x) * pow(k, -1, self.C.q) % self.C.q
|
||||
sig = b"".join(map(self.to_bytes, [R.x, R.y, s]))
|
||||
return urlsafe_b64encode(sig)
|
||||
|
||||
def verify(self, msg, sig):
|
||||
self.set_keys()
|
||||
try:
|
||||
assert len(sig) == 4 * self.t
|
||||
sig = urlsafe_b64decode(sig)
|
||||
arr = [sig[self.t * i : self.t * (i + 1)] for i in range(3)]
|
||||
Rx, Ry, s = map(self.from_bytes, arr)
|
||||
R = Point(Rx, Ry, self.C)
|
||||
return self.hash(msg) * self.C.G == s * R + self.Y * R.x
|
||||
except:
|
||||
return False
|
||||
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env python3
|
||||
import sqlite3
|
||||
|
||||
db = "database.db"
|
||||
con = sqlite3.connect(db)
|
||||
cur = con.cursor()
|
||||
cur.execute("SELECT * FROM users")
|
||||
|
||||
rows = cur.fetchall()
|
||||
for row in rows:
|
||||
print(row)
|
||||
@@ -0,0 +1,51 @@
|
||||
#!/usr/bin/env python3
|
||||
import hashlib
|
||||
import os
|
||||
import sqlite3
|
||||
import sys
|
||||
|
||||
db = "database.db"
|
||||
|
||||
|
||||
class User:
|
||||
def __init__(self, username, password, role):
|
||||
self.username: str = username
|
||||
self.password: str = password
|
||||
self.role: str = role
|
||||
|
||||
|
||||
def main():
|
||||
try:
|
||||
os.remove(db)
|
||||
except:
|
||||
pass
|
||||
|
||||
con = sqlite3.connect(db)
|
||||
con.execute("CREATE TABLE users (username TEXT, password TEXT, role TEXT)")
|
||||
|
||||
def insert_person(person: User):
|
||||
cur.execute(
|
||||
"INSERT INTO users (username, password, role) VALUES (?, ?, ?)",
|
||||
(
|
||||
person.username,
|
||||
hashlib.sha256(
|
||||
b"gema" + person.password.encode() + b"steg"
|
||||
).hexdigest(),
|
||||
person.role,
|
||||
),
|
||||
)
|
||||
con.commit()
|
||||
|
||||
cur = con.cursor()
|
||||
admin = User(sys.argv[1], sys.argv[2], "admin")
|
||||
guest = User("guest", "guest", "guest")
|
||||
insert_person(admin)
|
||||
insert_person(guest)
|
||||
con.close()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
if len(sys.argv) != 3:
|
||||
print(f"Usage: {sys.argv[0]} <username> <password>")
|
||||
exit()
|
||||
main()
|
||||
@@ -0,0 +1,113 @@
|
||||
#!/usr/bin/env python3
|
||||
from burvesigner import BurveSigner
|
||||
from flask import Flask, make_response, render_template, request, flash
|
||||
from hashlib import sha256
|
||||
from time import time
|
||||
import base64
|
||||
import json
|
||||
import secrets
|
||||
import sqlite3
|
||||
|
||||
|
||||
app = Flask(__name__)
|
||||
app.config["SECRET_KEY"] = secrets.token_hex()
|
||||
db = "database.db"
|
||||
signer = BurveSigner()
|
||||
|
||||
|
||||
b64p = lambda x: x + b"=" * (-len(x) % 4)
|
||||
b64u = lambda x: x.rstrip(b"=")
|
||||
b64e = lambda x: b64u(base64.urlsafe_b64encode(x))
|
||||
b64d = lambda x: base64.urlsafe_b64decode(b64p(x))
|
||||
|
||||
|
||||
def generate_token(user, role):
|
||||
payload = b64e(json.dumps({
|
||||
"user": user,
|
||||
"role": role,
|
||||
"exp": int(time()) + 300
|
||||
}).encode())
|
||||
signature = signer.sign(payload)
|
||||
token = payload + b"." + signature
|
||||
return token.decode()
|
||||
|
||||
|
||||
def validate_token(token):
|
||||
assert token.count(".") == 1
|
||||
payload, signature = token.split(".")
|
||||
assert signer.verify(payload.encode(), signature.encode())
|
||||
payload = json.loads(b64d(payload.encode()).decode())
|
||||
assert payload.get("user") and payload.get("role") and payload.get("exp")
|
||||
user, role, exp = payload.get("user"), payload.get("role"), payload.get("exp")
|
||||
assert int(time()) < exp
|
||||
return [user, role, exp]
|
||||
|
||||
|
||||
def create_response_data(user, role):
|
||||
data = f"Welcome, {user}! "
|
||||
if role == "admin":
|
||||
try:
|
||||
data += open("/flag.txt").read()
|
||||
except:
|
||||
data += "Flag is missing, please contact probset"
|
||||
else:
|
||||
data += "Only admin can access the flag"
|
||||
return data
|
||||
|
||||
|
||||
def get_role(username, password):
|
||||
connection = sqlite3.connect(db)
|
||||
cursor = connection.cursor()
|
||||
cursor.execute(
|
||||
"SELECT role FROM users WHERE username = ? AND password = ?",
|
||||
(username, sha256(b"gema" + password.encode() + b"steg").hexdigest()),
|
||||
)
|
||||
role = cursor.fetchone()
|
||||
connection.close()
|
||||
assert role
|
||||
return role[0]
|
||||
|
||||
|
||||
@app.route("/params", methods=["GET"])
|
||||
def params():
|
||||
return f"<pre>{json.dumps(signer.get_params(), indent=2)}</pre>"
|
||||
|
||||
|
||||
@app.route("/", methods=["POST", "GET"])
|
||||
def index():
|
||||
if request.method == "POST":
|
||||
username = request.form.get("username")
|
||||
password = request.form.get("password")
|
||||
try:
|
||||
assert 2 <= len(username) <= 32
|
||||
assert 2 <= len(password) <= 32
|
||||
role = get_role(username, password)
|
||||
token = generate_token(username, role)
|
||||
validate_token(token)
|
||||
response = make_response(render_template(
|
||||
"index.html",
|
||||
data=create_response_data(username, role)
|
||||
))
|
||||
response.set_cookie("token", token)
|
||||
return response
|
||||
except:
|
||||
flash("Invalid username and/or password")
|
||||
return render_template("index.html")
|
||||
else:
|
||||
token = request.cookies.get("token")
|
||||
if token:
|
||||
try:
|
||||
username, role, _ = validate_token(token)
|
||||
return render_template(
|
||||
"index.html",
|
||||
data=create_response_data(username, role)
|
||||
)
|
||||
except:
|
||||
flash("Invalid token")
|
||||
return render_template("index.html")
|
||||
else:
|
||||
return render_template("index.html")
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
app.run(host="0.0.0.0", port=80, debug=False)
|
||||
@@ -0,0 +1,3 @@
|
||||
fastecdsa
|
||||
Flask
|
||||
pycryptodome
|
||||
@@ -0,0 +1,5 @@
|
||||
#!/bin/bash
|
||||
|
||||
/usr/sbin/sshd -D &
|
||||
chmod +x ./main.py
|
||||
./main.py
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 20 KiB |
@@ -0,0 +1,8 @@
|
||||
function logout() {
|
||||
document.cookie = "token=;";
|
||||
}
|
||||
|
||||
setTimeout(function () {
|
||||
let flashItem = document.getElementById("flashes");
|
||||
flashItem.style.display = "none";
|
||||
}, 2000);
|
||||
@@ -0,0 +1,60 @@
|
||||
body {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
font-family: Arial, sans-serif;
|
||||
background-color: #f4f4f4;
|
||||
}
|
||||
|
||||
h1 {
|
||||
text-align: center;
|
||||
color: #333;
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
.container {
|
||||
max-width: 400px;
|
||||
margin: 5% auto;
|
||||
margin-bottom: 0;
|
||||
background-color: #fff;
|
||||
padding: 20px;
|
||||
border-radius: 5px;
|
||||
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
input {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
margin-bottom: 10px;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 3px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
input[type="submit"] {
|
||||
width: 100%;
|
||||
padding: 10px;
|
||||
background-color: #007bff;
|
||||
color: #fff;
|
||||
border: none;
|
||||
border-radius: 3px;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
p {
|
||||
margin: 10px 0;
|
||||
}
|
||||
|
||||
#flashes {
|
||||
max-width: 400px;
|
||||
margin: 0 auto;
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
margin-top: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
#flashes li {
|
||||
color: #ff6b6b;
|
||||
padding: 5px;
|
||||
border-radius: 3px;
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>BurveSigner</title>
|
||||
<link
|
||||
rel="stylesheet"
|
||||
href="{{ url_for('static', filename='style.css') }}"
|
||||
/>
|
||||
<link
|
||||
rel="shortcut icon"
|
||||
href="{{ url_for('static', filename='favicon.ico') }}"
|
||||
/>
|
||||
</head>
|
||||
<body>
|
||||
<div class="container">
|
||||
<h1>🅱️urveSigner</h1>
|
||||
{% if data %}
|
||||
<p>{{ data }}</p>
|
||||
<a onclick="logout()" href="/">Logout</a>
|
||||
{% else %}
|
||||
<form action="/" method="post">
|
||||
<input
|
||||
type="text"
|
||||
name="username"
|
||||
placeholder="Username"
|
||||
autofocus
|
||||
required
|
||||
/>
|
||||
<input
|
||||
type="password"
|
||||
name="password"
|
||||
placeholder="Password"
|
||||
required
|
||||
/>
|
||||
<input type="submit" value="Login" />
|
||||
</form>
|
||||
{% endif %}
|
||||
</div>
|
||||
{% with messages = get_flashed_messages() %} {% if messages %}
|
||||
<ul id="flashes">
|
||||
{% for message in messages %}
|
||||
<li>{{ message }}</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% endif %} {% endwith %}
|
||||
</body>
|
||||
<script src="{{ url_for('static', filename='script.js') }}"></script>
|
||||
</html>
|
||||
@@ -0,0 +1,20 @@
|
||||
FROM public.ecr.aws/docker/library/php:8.0-apache
|
||||
|
||||
ARG PASSWORD
|
||||
|
||||
RUN echo root:${PASSWORD} | chpasswd
|
||||
RUN apt-get update && apt-get install -y openssh-server curl
|
||||
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
|
||||
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
|
||||
RUN service ssh start
|
||||
|
||||
COPY src/ /var/www/html
|
||||
RUN mkdir /var/www/html/backups
|
||||
RUN chown -R www-data:www-data /var/www/html/backups
|
||||
RUN chmod -R 777 /var/www/html/backups
|
||||
|
||||
RUN touch /flag.txt
|
||||
COPY start.sh .
|
||||
|
||||
RUN chmod +x start.sh
|
||||
CMD ./start.sh
|
||||
@@ -0,0 +1,11 @@
|
||||
version: '3.1'
|
||||
|
||||
services:
|
||||
crawlback:
|
||||
build:
|
||||
context: .
|
||||
args:
|
||||
- PASSWORD=root
|
||||
ports:
|
||||
- "21000:80"
|
||||
- "21022:22"
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
function get($url){
|
||||
$curl = curl_init();
|
||||
curl_setopt_array($curl, array(
|
||||
CURLOPT_RETURNTRANSFER => 1,
|
||||
CURLOPT_URL => $url,
|
||||
));
|
||||
|
||||
$resp = curl_exec($curl);
|
||||
curl_close($curl);
|
||||
|
||||
return $resp;
|
||||
}
|
||||
|
||||
function save($data){
|
||||
$filename = 'backups/' . randstr(8) . '.html';
|
||||
$fp = fopen($filename, 'w');
|
||||
fwrite($fp, $data);
|
||||
fclose($fp);
|
||||
return $filename;
|
||||
}
|
||||
|
||||
function randstr($length){
|
||||
$str = '';
|
||||
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
|
||||
$size = strlen($chars);
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$str .= $chars[rand(0, $size - 1)];
|
||||
}
|
||||
return $str;
|
||||
}
|
||||
|
||||
if ($_SERVER["REQUEST_METHOD"] == "POST") {
|
||||
$url = $_POST["url"];
|
||||
$data = get($url);
|
||||
header('Location: ' . save($data));
|
||||
|
||||
} else {
|
||||
echo "Invalid request method";
|
||||
}
|
||||
?>
|
||||
@@ -0,0 +1,24 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<script src="https://cdn.tailwindcss.com"></script>
|
||||
<title>Crawlback</title>
|
||||
</head>
|
||||
<body class="bg-white">
|
||||
<div class="grid h-screen place-content-center">
|
||||
<div>
|
||||
<h1 class="tracking-wide text-sky-500 text-9xl font-bold">Crawlback Machine</h1>
|
||||
</div>
|
||||
<label class="block">
|
||||
<span class="sr-only">URL to Crawlback</span>
|
||||
<form action="crawlback.php" method="post">
|
||||
<div class="grid grid-cols-1 gap-2">
|
||||
<input type="text" id="url" name="url" class="bg-gray-50 border border-gray-300 text-gray-900 text-sm rounded-lg focus:ring-sky-500 focus:border-sky-500 block w-full p-2.5 dark:bg-gray-700 dark:border-gray-600 dark:placeholder-gray-400 dark:text-white dark:focus:ring-sky-500 dark:focus:border-sky-500" required placeholder="https://ctftime.org"></input>
|
||||
<input type="submit" value="fetch" class="text-white bg-sky-500 hover:bg-sky-600 focus:ring-4 focus:outline-none focus:ring-sky-300 font-medium rounded-lg text-sm w-full sm:w-auto px-5 py-2.5 text-center dark:bg-sky-600 dark:hover:bg-sky-700 dark:focus:ring-sky-800">
|
||||
</div>
|
||||
</form>
|
||||
</label>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,2 @@
|
||||
/usr/sbin/sshd -D &
|
||||
apache2-foreground
|
||||
@@ -0,0 +1,233 @@
|
||||
version: '3.1'
|
||||
|
||||
services:
|
||||
# --- art ---
|
||||
art:
|
||||
hostname: art
|
||||
restart: always
|
||||
build:
|
||||
context: art
|
||||
args:
|
||||
- PASSWORD=$PASSWORD_10000
|
||||
volumes:
|
||||
- ../receiver/flags/art.txt:/flag.txt:ro
|
||||
- ../utils/bashrc:/root/.bashrc:ro
|
||||
- ../utils/preexec.sh:/root/.preexec.sh:ro
|
||||
ports:
|
||||
- "10000:8080"
|
||||
- "10022:22"
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
# --- art ---
|
||||
|
||||
# --- xl ---
|
||||
xl:
|
||||
hostname: xl
|
||||
restart: always
|
||||
build:
|
||||
context: xl
|
||||
args:
|
||||
- PASSWORD=$PASSWORD_11000
|
||||
volumes:
|
||||
- ../receiver/flags/xl.txt:/flag.txt:ro
|
||||
- ../utils/bashrc:/root/.bashrc:ro
|
||||
- ../utils/preexec.sh:/root/.preexec.sh:ro
|
||||
ports:
|
||||
- "11000:3000"
|
||||
- "11022:22"
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
# --- xl ---
|
||||
|
||||
# --- gemas-notes ---
|
||||
database:
|
||||
restart: always
|
||||
image: public.ecr.aws/docker/library/mysql:8
|
||||
container_name: gemas-database
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: why_my_random_string_password_doesnot_working
|
||||
MYSQL_DATABASE: gemasnotes
|
||||
volumes:
|
||||
- ./gemas-notes/src/db/init.sql:/docker-entrypoint-initdb.d/init.sql
|
||||
|
||||
gemas-notes:
|
||||
hostname: gemas-notes
|
||||
restart: always
|
||||
container_name: gemas-notes
|
||||
build:
|
||||
context: ./gemas-notes/src/note-service
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
- PASSWORD=$PASSWORD_12000
|
||||
depends_on:
|
||||
- database
|
||||
- validation-service
|
||||
volumes:
|
||||
- ../utils/bashrc:/root/.bashrc:ro
|
||||
- ../utils/preexec.sh:/root/.preexec.sh:ro
|
||||
ports:
|
||||
- "12022:22"
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
|
||||
validation-service:
|
||||
restart: always
|
||||
container_name: validation-service
|
||||
build:
|
||||
context: ./gemas-notes/src/validation-service
|
||||
dockerfile: Dockerfile
|
||||
depends_on:
|
||||
- database
|
||||
ports:
|
||||
- "12000:80"
|
||||
# --- gemas-notes ---
|
||||
|
||||
# --- pasta ---
|
||||
pasta:
|
||||
hostname: pasta
|
||||
restart: always
|
||||
build:
|
||||
context: pasta
|
||||
args:
|
||||
- PASSWORD=$PASSWORD_13000
|
||||
volumes:
|
||||
- ../utils/bashrc:/root/.bashrc:ro
|
||||
- ../utils/preexec.sh:/root/.preexec.sh:ro
|
||||
- ../receiver/flags/pasta.txt:/ctf/pasta/flag.txt:ro
|
||||
ports:
|
||||
- "13000:8000"
|
||||
- "13022:22"
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
# --- pasta ---
|
||||
|
||||
# --- burvesigner ---
|
||||
burvesigner:
|
||||
hostname: burvesigner
|
||||
restart: always
|
||||
container_name: burvesigner
|
||||
build:
|
||||
context: ./burvesigner
|
||||
args:
|
||||
- PASSWORD=$PASSWORD_14000
|
||||
ports:
|
||||
- "14000:80"
|
||||
- "14022:22"
|
||||
volumes:
|
||||
- ../utils/bashrc:/root/.bashrc:ro
|
||||
- ../utils/preexec.sh:/root/.preexec.sh:ro
|
||||
- ../receiver/flags/burvesigner.txt:/flag.txt:ro
|
||||
- ../receiver/files/burvesigner.priv:/priv.data:ro
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
# --- burvesigner ---
|
||||
|
||||
# --- gemas-fetcher ---
|
||||
gemas-fetcher:
|
||||
container_name: gemas-fetcher
|
||||
hostname: gemas-fetcher
|
||||
build:
|
||||
context: ./gemas-fetcher
|
||||
dockerfile: Dockerfile
|
||||
args:
|
||||
- PASSWORD=$PASSWORD_16000
|
||||
ports:
|
||||
- "16000:8000"
|
||||
- "16022:22"
|
||||
environment:
|
||||
- MONGO_URI=mongodb://ctf:asjdkjk23j1k3dsdn2h233j3jj@mongodb:27017/web_fetcher?authSource=admin
|
||||
- APP_URI=http://0.0.0.0:16000
|
||||
volumes:
|
||||
- ../utils/bashrc:/root/.bashrc:ro
|
||||
- ../utils/preexec.sh:/root/.preexec.sh:ro
|
||||
- ../receiver/flags/gemas-fetcher.txt:/flag.txt:ro
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
depends_on:
|
||||
- mongodb
|
||||
|
||||
mongodb:
|
||||
container_name: mongodb_ctf
|
||||
image: public.ecr.aws/docker/library/mongo:4.4
|
||||
environment:
|
||||
- MONGO_INITDB_ROOT_USERNAME=ctf
|
||||
- MONGO_INITDB_ROOT_PASSWORD=asjdkjk23j1k3dsdn2h233j3jj
|
||||
- MONGO_INITDB_DATABASE=web_fetcher
|
||||
# --- gemas-fetcher ---
|
||||
|
||||
# --- s3 ---
|
||||
s3:
|
||||
hostname: s3
|
||||
restart: always
|
||||
container_name: s3
|
||||
build:
|
||||
context: ./s3
|
||||
args:
|
||||
- PASSWORD=$PASSWORD_20000
|
||||
ports:
|
||||
- "20000:80"
|
||||
- "20022:22"
|
||||
volumes:
|
||||
- ../utils/bashrc:/root/.bashrc:ro
|
||||
- ../utils/preexec.sh:/root/.preexec.sh:ro
|
||||
- ../receiver/flags/s3.txt:/flag.txt:ro
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
# --- s3 ---
|
||||
|
||||
# --- crawlback ---
|
||||
crawlback:
|
||||
hostname: crawlback
|
||||
restart: always
|
||||
build:
|
||||
context: crawlback
|
||||
args:
|
||||
- PASSWORD=$PASSWORD_21000
|
||||
volumes:
|
||||
- ../receiver/flags/crawlback.txt:/flag.txt:ro
|
||||
- ../utils/bashrc:/root/.bashrc:ro
|
||||
- ../utils/preexec.sh:/root/.preexec.sh:ro
|
||||
ports:
|
||||
- "21000:80"
|
||||
- "21022:22"
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
# --- crawlback ---
|
||||
|
||||
# --- back-to-basic ---
|
||||
back-to-basic:
|
||||
hostname: back-to-basic
|
||||
restart: always
|
||||
build:
|
||||
context: back-to-basic
|
||||
args:
|
||||
- PASSWORD=$PASSWORD_22000
|
||||
volumes:
|
||||
- ../receiver/flags/back-to-basic.txt:/flag.txt:ro
|
||||
- ../utils/bashrc:/root/.bashrc:ro
|
||||
- ../utils/preexec.sh:/root/.preexec.sh:ro
|
||||
ports:
|
||||
- "22000:8000"
|
||||
- "22022:22"
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
# --- back-to-basic ---
|
||||
|
||||
# --- hirnfick ---
|
||||
hirnfick:
|
||||
hostname: hirnfick
|
||||
restart: always
|
||||
build:
|
||||
context: hirnfick
|
||||
args:
|
||||
- PASSWORD=$PASSWORD_15000
|
||||
volumes:
|
||||
- ../receiver/flags/hirnfick.txt:/flag.txt:ro
|
||||
- ../utils/bashrc:/root/.bashrc:ro
|
||||
- ../utils/preexec.sh:/root/.preexec.sh:ro
|
||||
ports:
|
||||
- "15000:8000"
|
||||
- "15022:22"
|
||||
extra_hosts:
|
||||
- "host.docker.internal:host-gateway"
|
||||
# --- hirnfick ---
|
||||
@@ -0,0 +1,21 @@
|
||||
FROM public.ecr.aws/docker/library/python:3.10.6
|
||||
|
||||
ARG PASSWORD
|
||||
|
||||
RUN echo root:${PASSWORD} | chpasswd
|
||||
RUN apt-get update && apt-get install -y openssh-server curl
|
||||
RUN echo "PasswordAuthentication yes" >> /etc/ssh/sshd_config
|
||||
RUN echo "PermitRootLogin yes" >> /etc/ssh/sshd_config
|
||||
RUN service ssh start
|
||||
|
||||
RUN pip install --upgrade mongoengine blacksheep uvicorn passlib pycryptodome pytz urllib3 requests
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY ./src .
|
||||
RUN touch /flag.txt
|
||||
|
||||
COPY ./start.sh .
|
||||
RUN chmod +x /app/start.sh
|
||||
|
||||
CMD ./start.sh
|
||||
@@ -0,0 +1,318 @@
|
||||
#main-wrapper .left-sidebar[data-sidebarbg=skin5], #main-wrapper .left-sidebar[data-sidebarbg=skin5] ul {
|
||||
background-color: white !important;
|
||||
}
|
||||
|
||||
|
||||
.sidebar-nav ul .sidebar-item .sidebar-link.active i, .sidebar-nav ul, .sidebar-nav ul .sidebar-item.selected > .sidebar-link i {
|
||||
color: #ffff !important;
|
||||
}
|
||||
|
||||
.sidebar-nav ul .sidebar-item .sidebar-link, .sidebar-nav ul .sidebar-item .sidebar-link i {
|
||||
color: #888889 !important;
|
||||
}
|
||||
.sidebar-nav ul .sidebar-item .sidebar-link:hover, .sidebar-item .sidebar-link:hover i{
|
||||
color: #0178BC;
|
||||
}
|
||||
|
||||
.sidebar-nav ul .sidebar-item .sidebar-link.active,
|
||||
.sidebar-nav ul .sidebar-item .sidebar-link:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.sidebar-nav ul .sidebar-item.selected > .sidebar-link {
|
||||
color: #ffff !important;
|
||||
background: #0178BC;
|
||||
margin: 0px 15px;
|
||||
opacity: 1;
|
||||
border-radius: 10px;
|
||||
}
|
||||
|
||||
#main-wrapper .topbar .top-navbar .navbar-header[data-logobg=skin5] {
|
||||
background: #fff;
|
||||
}
|
||||
|
||||
#navbarSupportedContent {
|
||||
background: #fff!important;
|
||||
}
|
||||
.topbar .top-navbar .navbar-nav>.nav-item:hover {
|
||||
background:none;
|
||||
}
|
||||
|
||||
.logo-text{
|
||||
color: #0178BC;
|
||||
}
|
||||
|
||||
.bg-main{
|
||||
background-color: #0178BC;
|
||||
color: #fff;
|
||||
}
|
||||
|
||||
.bg-main:hover{
|
||||
background-color: #0467a0;
|
||||
color: #fff;
|
||||
}
|
||||
.text-main{
|
||||
color: #00659F;
|
||||
}
|
||||
|
||||
.border-primary{
|
||||
border-color: #00659F!important;
|
||||
}
|
||||
/* Notification */
|
||||
|
||||
.topbar .mailbox{
|
||||
min-width: 400px;
|
||||
}
|
||||
|
||||
.notification-button i, .notification-icon i {
|
||||
color: #6F767E;
|
||||
font-size: 1.5em;
|
||||
}
|
||||
.notification-button .blip {
|
||||
background-color: #FF6A55;
|
||||
border-radius: 50%;
|
||||
bottom: 45px;
|
||||
height: 8px;
|
||||
left: 10px;
|
||||
position: relative;
|
||||
transition: 0.2 ease-in-out;
|
||||
width: 8px;
|
||||
}
|
||||
.notification-icon .blip {
|
||||
background-color: #FF6A55;
|
||||
border-radius: 50%;
|
||||
bottom: 23px;
|
||||
height: 8px;
|
||||
left: 25px;
|
||||
position: relative;
|
||||
transition: 0.2 ease-in-out;
|
||||
width: 8px;
|
||||
}
|
||||
.notification-button .blip.hide {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.notify-time{
|
||||
font-size: 10px;
|
||||
}
|
||||
|
||||
.rounded-m{
|
||||
border-radius: 5px !important;
|
||||
}
|
||||
|
||||
.rounded-xl{
|
||||
border-radius: 10px !important;
|
||||
}
|
||||
|
||||
.form-control-sm, .form-control {
|
||||
border-radius: 8px !important;
|
||||
}
|
||||
|
||||
/* Table */
|
||||
.tb-head-first { border-top-left-radius: 10px !important;}
|
||||
.tb-head-last { border-top-right-radius: 10px !important;}
|
||||
.table>:not(caption)>*>* {
|
||||
border : 0 !important
|
||||
}
|
||||
|
||||
/* Modal */
|
||||
|
||||
.modal-content{
|
||||
background-color: #F2F5F8;
|
||||
}
|
||||
|
||||
.card-addons{
|
||||
/* width: 11.5rem; */
|
||||
/* position: relative; */
|
||||
}
|
||||
.card-header-addons{
|
||||
background: linear-gradient(91.25deg, #0178BC 0%, #005281 100%);
|
||||
border-radius: 6px 6px 0px 0px;
|
||||
padding: 10px;
|
||||
position: relative;
|
||||
}
|
||||
.card-body-addons{
|
||||
background: #FFF;
|
||||
border-radius: 0px 0px 6px 6px;
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.add-ons-img{
|
||||
position: absolute;
|
||||
bottom: 5px;
|
||||
right: 5px;
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
/* common */
|
||||
.ribbon {
|
||||
width: 150px;
|
||||
height: 150px;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
}
|
||||
.ribbon::before,
|
||||
.ribbon::after {
|
||||
position: absolute;
|
||||
z-index: -1;
|
||||
content: '';
|
||||
display: block;
|
||||
border: 5px solid #2980b9;
|
||||
}
|
||||
.ribbon span {
|
||||
position: absolute;
|
||||
display: block;
|
||||
width: 300px;
|
||||
padding: 5px 0;
|
||||
background: linear-gradient(152.92deg, #FFA800 16.92%, #D08900 93.43%);;
|
||||
box-shadow: 0 5px 10px rgba(0,0,0,.1);
|
||||
color: #fff;
|
||||
font: 700 10px/1 'Lato', sans-serif;
|
||||
text-shadow: 0 1px 1px rgba(0,0,0,.2);
|
||||
text-transform: uppercase;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
/* top right*/
|
||||
.ribbon-top-right {
|
||||
top: 0px;
|
||||
right: 0px;
|
||||
}
|
||||
.ribbon-top-right::before,
|
||||
.ribbon-top-right::after {
|
||||
border-top-color: transparent;
|
||||
border-right-color: transparent;
|
||||
}
|
||||
.ribbon-top-right::before {
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
.ribbon-top-right::after {
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
}
|
||||
.ribbon-top-right span {
|
||||
left: -25px;
|
||||
top: 15px;
|
||||
transform: rotate(45deg);
|
||||
}
|
||||
|
||||
|
||||
/* Button */
|
||||
|
||||
.btn-info {
|
||||
color: #fff;
|
||||
background-color: #0178BC;
|
||||
border-color: #0178BC;
|
||||
}
|
||||
.btn-info:hover {
|
||||
color: #fff;
|
||||
background-color: #0890df;
|
||||
border-color: #0890df;
|
||||
}
|
||||
.btn-info.focus,
|
||||
.btn-info:focus {
|
||||
color: #fff;
|
||||
background-color: #0883cb;
|
||||
border-color: #0890df;
|
||||
-webkit-box-shadow: 0 0 0 0.2rem #0572b19f;
|
||||
box-shadow: 0 0 0 0.2rem #0572b19f;
|
||||
}
|
||||
.btn-info.disabled,
|
||||
.btn-info:disabled {
|
||||
color: #fff;
|
||||
background-color: #0178BC;
|
||||
border-color: #0178BC;
|
||||
}
|
||||
.btn-info:not(:disabled):not(.disabled).active,
|
||||
.btn-info:not(:disabled):not(.disabled):active,
|
||||
.show > .btn-info.dropdown-toggle {
|
||||
color: #fff;
|
||||
background-color: #0890df;
|
||||
border-color: #068ad6;
|
||||
}
|
||||
.btn-info:not(:disabled):not(.disabled).active:focus,
|
||||
.btn-info:not(:disabled):not(.disabled):active:focus,
|
||||
.show > .btn-info.dropdown-toggle:focus {
|
||||
-webkit-box-shadow: 0 0 0 0.2rem rgba(67, 111, 178, 0.5);
|
||||
box-shadow: 0 0 0 0.2rem rgba(67, 111, 178, 0.5);
|
||||
}
|
||||
|
||||
|
||||
/* Pagination */
|
||||
|
||||
.page-item .page-link{
|
||||
border-radius: 8px !important;
|
||||
border-color: #F1F7FF !important;
|
||||
background-color: #F1F7FF !important;
|
||||
}
|
||||
|
||||
.page-item.active .page-link{
|
||||
background-color: #0178BC !important;
|
||||
border-color: #0178BC !important;
|
||||
}
|
||||
.paginate_button{
|
||||
margin: 0 5px;
|
||||
}
|
||||
|
||||
.mini-sidebar .sidebar-nav ul .sidebar-item .sidebar-link.active {
|
||||
margin: 0px 5px;
|
||||
}
|
||||
.mini-sidebar .sidebar-item.mn{
|
||||
|
||||
margin-left: 1rem!important;
|
||||
}
|
||||
|
||||
@media (max-width: 1199.98px) {
|
||||
.sidebar-nav ul .sidebar-item .sidebar-link.active {
|
||||
margin: 0px 5px;
|
||||
}
|
||||
.sidebar-item.mn{
|
||||
|
||||
margin-left: 1rem!important;
|
||||
}
|
||||
}
|
||||
|
||||
.swal2-html-container{
|
||||
margin: 0 !important;
|
||||
}
|
||||
.swal2-close{
|
||||
font-size: 14px !important;
|
||||
top: 10px;
|
||||
}
|
||||
|
||||
.bg-red{
|
||||
color: #fff;
|
||||
background-color: #dc3545;
|
||||
border-color: #dc3545;
|
||||
}
|
||||
|
||||
.swal2-popup{
|
||||
width: 25em !important;
|
||||
}
|
||||
|
||||
.guide-step{
|
||||
border: 2px solid #0178BC;
|
||||
}
|
||||
|
||||
.guide-step .driver-popover-title{
|
||||
font-size: 16px !important;
|
||||
}
|
||||
|
||||
.guide-step .driver-popover-footer button{
|
||||
border: 1px solid #0178BC !important;
|
||||
color: #0178BC !important;
|
||||
font: 14px/normal sans-serif !important;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
.guide-step .driver-prev-btn{
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.card-info{
|
||||
background-color: rgba(1, 120, 188, 0.08);
|
||||
color: #0178BC;
|
||||
padding: 20px;
|
||||
border-radius: 10px;
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
.email {
|
||||
display: grid;
|
||||
grid-template-columns: 50vw;
|
||||
grid-auto-rows: min-content;
|
||||
justify-content: center;
|
||||
/* padding: 10rem 0; */
|
||||
}
|
||||
|
||||
.email__header,
|
||||
.email__content,
|
||||
.email__footer {
|
||||
padding: 3.2rem;
|
||||
}
|
||||
|
||||
.email__container {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-auto-rows: min-content;
|
||||
color: #333333;
|
||||
background-color: #F2F5F8;
|
||||
padding: 3.2rem;
|
||||
}
|
||||
|
||||
.email__header {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-gap: 2rem;
|
||||
padding-bottom: 2rem;
|
||||
}
|
||||
|
||||
.email__logo {
|
||||
width: 3.5rem;
|
||||
height: 3.5rem;
|
||||
}
|
||||
|
||||
.email__title {
|
||||
font-size: 2.4rem;
|
||||
font-weight: 900;
|
||||
color: #0178BC;
|
||||
}
|
||||
|
||||
.email__content {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-auto-rows: min-content;
|
||||
grid-gap: 2rem;
|
||||
background-color: #fff;
|
||||
border-radius: 4px;
|
||||
}
|
||||
|
||||
.email__footer {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-auto-rows: min-content;
|
||||
grid-gap: 4rem;
|
||||
font-size: 1.4rem;
|
||||
font-weight: 400;
|
||||
background-color: #F7F9FC;
|
||||
}
|
||||
|
||||
.email__footer .email__gmail {
|
||||
color: #0178BC;
|
||||
}
|
||||
|
||||
.email__content p {
|
||||
font-size: 1.6rem;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
.email__title-content {
|
||||
font-size: 1.6rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.email__cta {
|
||||
justify-self: start;
|
||||
text-transform: uppercase;
|
||||
outline: none;
|
||||
border: none;
|
||||
background-color: var(--color-secondary);
|
||||
padding: 1rem 3rem;
|
||||
border-radius: 4px;
|
||||
font-family: var(--font-primary);
|
||||
font-size: 1.4rem;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.email__gmail {
|
||||
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
.reset__redirect {
|
||||
text-decoration: none;
|
||||
color: #00A5CE;
|
||||
font-size: 1.6rem;
|
||||
font-weight: 400;
|
||||
}
|
||||
@@ -0,0 +1,214 @@
|
||||
@import url(icons/font-awesome/css/fontawesome-all.css);
|
||||
@import url(icons/themify-icons/themify-icons.css);
|
||||
@import url(icons/material-design-iconic-font/css/materialdesignicons.min.css);
|
||||
.forgot {
|
||||
min-height: 100vh;
|
||||
}
|
||||
|
||||
.forgot__container {
|
||||
display: grid;
|
||||
grid-template-columns: 75vw;
|
||||
grid-auto-rows: min-content;
|
||||
justify-content: center;
|
||||
align-content: center;
|
||||
padding: 8rem 0;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 28em) {
|
||||
.forgot__container {
|
||||
grid-template-columns: 1fr;
|
||||
padding: 8rem 3rem;
|
||||
}
|
||||
}
|
||||
|
||||
.forgot__form-box {
|
||||
display: grid;
|
||||
grid-template-columns: 55% 1fr;
|
||||
grid-auto-rows: min-content;
|
||||
filter: drop-shadow(0px 0px 30px rgba(0, 0, 0, .15));
|
||||
}
|
||||
|
||||
.show_password .btn {
|
||||
border: none;
|
||||
background: none;
|
||||
}
|
||||
.show_password .btn:focus, .show_password .btn.focus, .show_password .btn:hover{
|
||||
outline: none !important;
|
||||
box-shadow: none !important;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 28em) {
|
||||
.forgot__form-box {
|
||||
grid-template-columns: 1fr;
|
||||
}
|
||||
}
|
||||
|
||||
.forgot__banner {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-auto-rows: min-content;
|
||||
align-content: flex-end;
|
||||
padding: 6rem 4rem;
|
||||
background-image: linear-gradient(0, rgba(0,0,0,.4), rgba(0,0,0,.4)), url('../images/login/login-banner.png');
|
||||
background-size: cover;
|
||||
background-position: center center;
|
||||
}
|
||||
|
||||
.forgot__banner-detail {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
gap: 1rem;
|
||||
}
|
||||
|
||||
.forgot__banner-detail img {
|
||||
width: 9rem;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 28em) {
|
||||
.forgot__banner {
|
||||
padding: 4rem;
|
||||
}
|
||||
}
|
||||
|
||||
.forgot__banner-title {
|
||||
font-size: 3.2rem;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.forgot__banner-desc {
|
||||
font-size: 1.4rem;
|
||||
font-weight: 400;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 28em) {
|
||||
.forgot__banner-title {
|
||||
font-size: 2.8rem;
|
||||
}
|
||||
|
||||
.forgot__banner-desc {
|
||||
font-size: 1.2rem;
|
||||
}
|
||||
}
|
||||
|
||||
.forgot__form {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-auto-rows: min-content;
|
||||
align-content: space-between;
|
||||
grid-gap: 6rem;
|
||||
padding: 5rem;
|
||||
background-color: #fff;
|
||||
}
|
||||
|
||||
.forgot__form-logo {
|
||||
width: 4.2rem;
|
||||
}
|
||||
|
||||
.forgot__form-title {
|
||||
font-size: 2.4rem;
|
||||
font-weight: 500;
|
||||
color: var(--color-font-primary);
|
||||
}
|
||||
|
||||
.forgot__form > div {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-auto-rows: min-content;
|
||||
grid-gap: 3rem;
|
||||
}
|
||||
|
||||
.input-group {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr;
|
||||
grid-auto-rows: min-content;
|
||||
grid-gap: 1rem;
|
||||
}
|
||||
|
||||
.input-group .icon-eye {
|
||||
position: absolute;
|
||||
bottom: 10px;
|
||||
right: 10px;
|
||||
}
|
||||
|
||||
@media screen and (max-width: 28em) {
|
||||
.input-group .icon-eye {
|
||||
bottom: 10px;
|
||||
}
|
||||
}
|
||||
.input-group label {
|
||||
font-size: 1.4rem;
|
||||
font-weight: 500;
|
||||
color: #5F6377;
|
||||
}
|
||||
|
||||
.input-group input {
|
||||
outline: none;
|
||||
font-family: var(--font-primary);
|
||||
background: #FCFCFD;
|
||||
border: 1px solid #CFD0D7;
|
||||
border-radius: 2px;
|
||||
padding: 1rem 1.2rem;
|
||||
transition: .1s ease;
|
||||
}
|
||||
|
||||
.input-group input::placeholder {
|
||||
font-size: 1.2rem;
|
||||
font-weight: 400;
|
||||
color: #939393;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
.input-group input:focus {
|
||||
border: 1px solid #0094B9;
|
||||
box-shadow: 0px 0px 4px rgba(52, 133, 254, 0.41);
|
||||
}
|
||||
|
||||
.block-help {
|
||||
font-weight: 300;
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.forgot-pass,
|
||||
.forgot-pass:visited {
|
||||
justify-self: end;
|
||||
text-decoration: none;
|
||||
font-size: 1.2rem;
|
||||
font-weight: 400;
|
||||
color: var(--color-secondary);
|
||||
}
|
||||
|
||||
.forgot__redirect {
|
||||
justify-self: center;
|
||||
font-size: 1.2rem;
|
||||
font-weight: 400;
|
||||
color: #989898;
|
||||
}
|
||||
|
||||
.forgot__redirect a {
|
||||
text-decoration: none;
|
||||
color: var(--color-secondary);
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.forgot__cta {
|
||||
outline: none;
|
||||
border: none;
|
||||
background-color: var(--color-secondary);
|
||||
padding: 1rem 3rem;
|
||||
border-radius: 4px;
|
||||
font-family: var(--font-primary);
|
||||
font-size: 1.4rem;
|
||||
font-weight: 600;
|
||||
color: #fff;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.forgot-compliment {
|
||||
position: absolute;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
width: 40rem;
|
||||
z-index: -1;
|
||||
}
|
||||
+13
@@ -0,0 +1,13 @@
|
||||
/*!
|
||||
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Brands';
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
src: url("../webfonts/fa-brands-400.eot");
|
||||
src: url("../webfonts/fa-brands-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-brands-400.woff2") format("woff2"), url("../webfonts/fa-brands-400.woff") format("woff"), url("../webfonts/fa-brands-400.ttf") format("truetype"), url("../webfonts/fa-brands-400.svg#fontawesome") format("svg"); }
|
||||
|
||||
.fab {
|
||||
font-family: 'Font Awesome 5 Brands'; }
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
/*!
|
||||
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face{font-family:Font Awesome\ 5 Brands;font-style:normal;font-weight:400;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:Font Awesome\ 5 Brands}
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
/*!
|
||||
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-style: normal;
|
||||
font-weight: 400;
|
||||
src: url("../webfonts/fa-regular-400.eot");
|
||||
src: url("../webfonts/fa-regular-400.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-regular-400.woff2") format("woff2"), url("../webfonts/fa-regular-400.woff") format("woff"), url("../webfonts/fa-regular-400.ttf") format("truetype"), url("../webfonts/fa-regular-400.svg#fontawesome") format("svg"); }
|
||||
|
||||
.far {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-weight: 400; }
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
/*!
|
||||
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:400;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-family:Font Awesome\ 5 Free;font-weight:400}
|
||||
+15
@@ -0,0 +1,15 @@
|
||||
/*!
|
||||
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-style: normal;
|
||||
font-weight: 900;
|
||||
src: url("../webfonts/fa-solid-900.eot");
|
||||
src: url("../webfonts/fa-solid-900.eot?#iefix") format("embedded-opentype"), url("../webfonts/fa-solid-900.woff2") format("woff2"), url("../webfonts/fa-solid-900.woff") format("woff"), url("../webfonts/fa-solid-900.ttf") format("truetype"), url("../webfonts/fa-solid-900.svg#fontawesome") format("svg"); }
|
||||
|
||||
.fa,
|
||||
.fas {
|
||||
font-family: 'Font Awesome 5 Free';
|
||||
font-weight: 900; }
|
||||
+5
@@ -0,0 +1,5 @@
|
||||
/*!
|
||||
* Font Awesome Free 5.0.9 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license (Icons: CC BY 4.0, Fonts: SIL OFL 1.1, Code: MIT License)
|
||||
*/
|
||||
@font-face{font-family:Font Awesome\ 5 Free;font-style:normal;font-weight:900;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:Font Awesome\ 5 Free;font-weight:900}
|
||||
+2855
File diff suppressed because it is too large
Load Diff
Vendored
+5
File diff suppressed because one or more lines are too long
+2825
File diff suppressed because it is too large
Load Diff
+5
File diff suppressed because one or more lines are too long
+19
@@ -0,0 +1,19 @@
|
||||
// Animated Icons
|
||||
// --------------------------
|
||||
|
||||
.@{fa-css-prefix}-spin {
|
||||
animation: fa-spin 2s infinite linear;
|
||||
}
|
||||
|
||||
.@{fa-css-prefix}-pulse {
|
||||
animation: fa-spin 1s infinite steps(8);
|
||||
}
|
||||
|
||||
@keyframes fa-spin {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
+16
@@ -0,0 +1,16 @@
|
||||
// Bordered & Pulled
|
||||
// -------------------------
|
||||
|
||||
.@{fa-css-prefix}-border {
|
||||
border-radius: .1em;
|
||||
border: solid .08em @fa-border-color;
|
||||
padding: .2em .25em .15em;
|
||||
}
|
||||
|
||||
.@{fa-css-prefix}-pull-left { float: left; }
|
||||
.@{fa-css-prefix}-pull-right { float: right; }
|
||||
|
||||
.@{fa-css-prefix}, .fas, .far, .fal, .fab {
|
||||
&.@{fa-css-prefix}-pull-left { margin-right: .3em; }
|
||||
&.@{fa-css-prefix}-pull-right { margin-left: .3em; }
|
||||
}
|
||||
+12
@@ -0,0 +1,12 @@
|
||||
// Base Class Definition
|
||||
// -------------------------
|
||||
|
||||
.@{fa-css-prefix}, .fas, .far, .fal, .fab {
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
display: inline-block;
|
||||
font-style: normal;
|
||||
font-variant: normal;
|
||||
text-rendering: auto;
|
||||
line-height: 1;
|
||||
}
|
||||
+6
@@ -0,0 +1,6 @@
|
||||
// Fixed Width Icons
|
||||
// -------------------------
|
||||
.@{fa-css-prefix}-fw {
|
||||
text-align: center;
|
||||
width: (20em / 16);
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user