Initial commit

This commit is contained in:
Rayhan Hanaputra
2025-10-10 22:18:06 +07:00
committed by GitHub
commit ea02892f14
1246 changed files with 289342 additions and 0 deletions
+1
View File
@@ -0,0 +1 @@
.env
+24
View File
@@ -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
+4
View File
@@ -0,0 +1,4 @@
source "http://rubygems.org"
gem "sinatra"
gem "slim"
+14
View File
@@ -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
+11
View File
@@ -0,0 +1,11 @@
version: '3'
services:
art:
restart: always
build:
context: .
args:
- PASSWORD=root
ports:
- "10000:8080"
- "10022:22"
+5
View File
@@ -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"
+29
View File
@@ -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
+18
View File
@@ -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
}
+15
View File
@@ -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;
}
+3
View File
@@ -0,0 +1,3 @@
#!/bin/sh
/usr/sbin/sshd -D &
su ctf -c "/ctf/main"
+27
View File
@@ -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
+1
View File
@@ -0,0 +1 @@
PLACEHOLDER
+1
View File
@@ -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()
+113
View File
@@ -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
+5
View File
@@ -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>
+20
View File
@@ -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
+11
View File
@@ -0,0 +1,11 @@
version: '3.1'
services:
crawlback:
build:
context: .
args:
- PASSWORD=root
ports:
- "21000:80"
- "21022:22"
+41
View File
@@ -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";
}
?>
+24
View File
@@ -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>
+2
View File
@@ -0,0 +1,2 @@
/usr/sbin/sshd -D &
apache2-foreground
+233
View File
@@ -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 ---
+21
View File
@@ -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;
}
@@ -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'; }
@@ -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}
@@ -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; }
@@ -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}
@@ -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; }
@@ -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}
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
File diff suppressed because one or more lines are too long
@@ -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);
}
}
@@ -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; }
}
@@ -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;
}
@@ -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